2012-02-15 68 views
1

如果我有一个如下的文件,最好的方法是打印包含第一个字段的每一行的最佳方法是共同的(即打印每行的字段[0] ='a',每行的字段[0 ] ='b')?我应该使用sort(),还是将字典的值填充为列表,或者利用类对每个字段进行分类,或者使用search()?也许我正在过分简单的解决方案。使用sort()或search()?

文件:

a 2012 fff 

b 2012 xxx 

a 2011 fff 

a 2011 vvv 

b 2010 sss 

定期排序:

with open('test.txt','r') as file: 
    for line in file: 
     field0,field1,field2=line.split() 
     field0.sort() # ??? 

OR

class MyClass: 
    def __init__(self,field0,field1,field2): 
     self.field0=field0 
     self.field1=field1 
     self.field2=field2 
    def grabField(): 
     for i in MyClass.field0: 
      print MyClass.field0,MyClass.field1,MyClass.field2 

with open('test.txt','r') as file: 
    for line in file: 
     field0,field1,field2=line.split() 
     MyClass(field0,field1,field2) 
grabField() 

我已经确定了以下代码来填充字典和排序的值:

from collections import defaultdict 
res = defaultdict(list) 
with open('test.txt','r') as file: 
    for line in file: 
     field0, field1, field2 = line.split() 
     res[field0] += [field1, field2] 

for i in res.keys(): 
    print i, sorted(res[i], key=lambda x: x[0]) 

然而,这产生 “一个[2011,2011,2012,FFF,FFF,VVV]” 和我想输出是在完全一样的格式作为输入(但排序):

a 2011 fff 

a 2011 vvv 

a 2012 fff 

我不能只使用原始输入排序,因为我将多次引用并需要存储在内存中。每行的值应存储在列表中(即字典值是列表的列表)?

回答

1

我只想用sorted

>>> with open('test.txt') as f: 
... lines = [l.strip() for l in f.readlines()] 
... 
>>> sorted_nonempty_lines = sorted((l for l in lines if l), key=lambda x: x.split()[0]) 
>>> 
>>> for line in sorted_nonempty_lines: 
... print line 
... 
a 2012 fff 
a 2011 fff 
a 2011 vvv 
b 2012 xxx 
b 2010 sss 
1

这真的取决于你在做什么。如果要选择以a开头的所有行,忽略其余部分并关闭文件,则没有任何事情比从a开始的行逐行搜索更复杂。你必须通过整个列表来查找所有的行,但是你得到了你需要的数据,所以没有任何意义可做更多的事情。如果您需要多次查询数据,并且您有足够的内存来存储while文件,那么按照您的建议,使用带有列表作为值的字典是有意义的。这样,您只需要查看一次该文件,然后可以对数据执行多个查询。

排序数据可能是这种特殊情况下最糟糕的解决方案,因为它需要O(n * log(n))时间对列表进行排序,但只需O(n)次来遍历文件并创建一本字典。

+0

我需要多次查询数据并包含所有字段,所以我的直觉就是利用一个带有列表值的类或字典,或者甚至是一个具有值作为类的字典。只是在如何在不使用sort()的情况下获取输出中的数据而苦苦挣扎。 – NewToPy 2012-02-15 04:03:36

+0

@Christopher J. Stuart,当你说“按输出排序”时,你是什么意思?我假设你知道如何创建一个字典,其值是以'a'开头的行列表(或其他)。你是否需要通过其他参数对这些列表进行排序?在那种情况下,你必须对它们进行排序! – senderle 2012-02-15 04:07:20

+0

我的歉意,我明白,我应该使用第一个字段作为关键,但我也需要输出按字段排序[1](忘记提及this.sorry!),以便我可以说每个键给我所有包含该密钥的行并根据字段进行排序[1] – NewToPy 2012-02-15 04:14:47