2012-07-25 48 views
0
线

就拿短文件包含这些行:的Python:确定缺少

Apple = 1 
Pear = 1 
Orange = 2 
; 
Orange = 3 
Pear = 1 
; 
Apple = 1 
Pear = 1 
Orange = 1 

我做什么的ReadLine文本文件,并把AppleOrangePear到各自的列表,如:

Orange = [ 2,3,1 ] 
Pear = [ 1,1,1 ] 

我以前line.count('Apple')==1,以确定在文本文件中的当前行是一个水果,然后=到列表后追加值。

如您所见,第二部分缺少Apple。我想要列表是:

Apple = [ 1,'-',1] 

每当行不显示水果,清单应追加-,以表明它。

我的问题是,我该怎么做,即。以确定某个部分缺少水果名称,然后将-添加到该部分。

+0

'苹果= [1, - , - 1]'无效蟒。我假设你打算使用字符串。 – jamylak 2012-07-25 06:05:27

+0

雅在字符串中。抱歉。 – 2012-07-25 06:05:56

+0

@Tadeck我不知道如何确定文本文件中缺失的水果线。我有一些使用“;”的想法在每节的结尾处,让Python知道如果在该节的最后,水果名称没有被追加到列表中,那么在它后面附加“ - ”。 – 2012-07-25 06:07:41

回答

2

您可以保留一个数组,其中包含所有在一节中找到的水果名称。当你遇到一个分号时,如果它的名字存在于数组中并追加一个' - '(如果它没有),那么你检查每一个水果,然后清除该数组并继续下一节。

+0

我明白了。是的,这是我想到的。我会试一试。 Thx – 2012-07-25 06:13:46

+0

如果在第一节中缺少这一行,这不起作用。如果你想这样做,你必须从一开始就有一个完整的水果列表,或者你必须保留所有“部分”直到最后,然后检查每一个是否包含所有水果。 – Jochen 2012-07-25 06:19:49

+0

我认为他从一开始就有完整的水果清单,因为他在他们后面命名了他的变量。 – Michael 2012-07-25 06:22:18

0
if line.count('Apple')==1: 
    Apple.append(str(number)) 
else: 
    Apple.append('-') 
+0

我试过了。恐怕结果会在列表中出现很多' - ',因为其他所有不包含Apple的行都会成为其他情况! – 2012-07-25 06:42:41

+0

你可以尝试: '如果'苹果'不在['苹果','橙','梨']:' – HVNSweeting 2012-07-25 08:14:45

0
from collections import defaultdict 
from itertools import takewhile 

d = defaultdict(list) 
valid_fruits = set(['Apple', 'Pear', 'Orange']) 

with open('data.txt') as f: 
    while True: 
     fruits = dict(takewhile(lambda x: x[0] != ';', 
           (line.rstrip().split(' = ') for line in f))) 
     if not fruits: 
      break 
     for fruit in valid_fruits: 
      if fruit in fruits: 
       d[fruit].append(int(fruits[fruit])) 
      else: 
       d[fruit].append('-') 

print d 

输出:

defaultdict(<type 'list'>, {'Orange': [2, 3, 1], 'Pear': [1, 1, 1], 'Apple': [1, '-', 1]}) 
+0

好的。虽然我认为我已经在上面找到了一个更加简单的解决方案,它应该适合我当前的脚本。谢谢。 – 2012-07-25 06:44:03