使用sort()或search()?

时间:2012-02-15 03:37:56

标签: python

如果我有一个如下所示的文件,那么打印包含第一个共同字段的每一行的最佳方法是什么(即打印每一行[0] ='a',每行该字段[ 0] ='b')?我应该使用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])

然而,这会产生“a [2011,2011,2012,fff,fff,vvv]”并且我希望输出与输入的格式完全相同(但已排序):

a 2011 fff

a 2011 vvv

a 2012 fff

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

这实际上取决于你在做什么。如果你想选择以a开头的所有行,忽略其余的行,并关闭文件,除了逐行搜索以a开头的行之外,没有什么比这更复杂的了。 。您必须浏览整个列表才能找到所有行,但是您已经获得了所需的数据,因此没有必要再做更多的事了。

另一方面,如果您需要多次查询数据,并且您有足够的内存来存储while文件,那么使用带有列表作为值的dict是有意义的,如您所建议的那样。这样,您只需要浏览一次文件,然后可以对数据进行多次查询。

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