2012-02-15 64 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