2012-02-15 167 views
1

輸入文件 '的test.txt':字典中的列表值的列表?

a 2012 fff 

b 2011 ttt 

a 2011 fff 

b 2012 sss 

a 2011 vvv 

我已確定下面的代碼來填充字典和值進行排序:

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 

我不能只是排序使用原始輸入,因爲我將是裁判多次登錄並需要存儲在內存中。每行的值應存儲在列表中(即字典值是列表的列表)?

回答

0

嘗試更改[field1, field2](field1, field2)以在排序時對字段進行分組。然後,您可以像這樣的輸出:

for i in res.keys(): 
    for pair in sorted(res[i]): 
     print i, ' '.join(pair) 
0

您可以簡單地創建一個列表,其中每個條目的line.split()的結果,然後進行排序,列出來得到正確的次序:

res = [] 
with open('test.txt','r') as file: 
    for line in file: 
     res.append(line.split()) 

res.sort() 
for i in res: 
    print ' '.join(i) 

看完後文件res應該是這樣的:

>>> pprint.pprint(res) 
[['a', '2012', 'fff'], 
['b', '2011', 'ttt'], 
['a', '2011', 'fff'], 
['b', '2012', 'sss'], 
['a', '2011', 'vvv']] 

然後res.sort()後,你將有以下,這是你想要的順序:

>>> pprint.pprint(sorted(res)) 
[['a', '2011', 'fff'], 
['a', '2011', 'vvv'], 
['a', '2012', 'fff'], 
['b', '2011', 'ttt'], 
['b', '2012', 'sss']] 

這是有效的,因爲序列類型按照字典順序進行比較;第一項是比較;如果它們是相同的,則比較第二項,等等。 [source]

1

假設你需要一個dict爲你自​​己的原因建造。

你需要改變這一行:

res[field0] += [field1, field2] 

有:

res[field0].append((field1, field2)) 

然後排序是這樣的:

for key in sorted(res): 
    for pair in sorted(res[key]): 
     print '{0} {pair[0]} {pair[1]}'.format(key, pair=pair) 
+0

這正是我一直在尋找!我只是改變了排序,以便更簡潔一些:'對於res.keys()中的鍵:'print key,sorted(res [key]) – NewToPy 2012-02-15 20:27:37

+0

@Christopher:不客氣,我認爲你想排序鍵也是,但你明白了。我可以期待你會[接受](http://meta.stackexchange.com/q/5234/177799)這個答案:) – 2012-02-15 20:43:27

0

這應該讓他們全部整理爲您服務。它按順序對每個元組位置進行正常排序(),並且很容易定製。

res = [] 

with open('test.txt','r') as file: 
    for line in file: 
     if line.strip(): 
      f = line.split() 
      res.append((f[0], int(f[1]), f[2])) 

fullysorted = sorted(res, key=lambda tup: (tup[0], tup[1], tup[2])) 

for i in fullysorted: 
    print '%s %i %s' % (i) 

返回:

a 2011 fff 
a 2011 vvv 
a 2012 fff 
b 2011 ttt 
b 2012 sss 

(我還假設你想在今年爲int,而不是字符串)

0

如果你只需要排序的行做到這一點:

with open('test.txt','r') as f: 
    res = sorted(f) 

如果您需要分割線,請執行以下操作:

with open('test.txt','r') as f: 
    res = sorted(line.split() for line in f) 

如果你的第二列並不總是四位數字,你需要告訴sorted把它當作一個整數:

with open('test.txt','r') as f: 
    res = sorted((line.split()) for line in f), key=lambda x:(x[0], int(x[1]), x[2]))