如果我有一个如下所示的文件,那么打印包含第一个共同字段的每一行的最佳方法是什么(即打印每一行[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,因为我将多次引用并需要存储在内存中。每行的值是否应存储在列表中(即字典值是列表列表)?
答案 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)时间来遍历文件一次并创建一个字典。