2009-06-25 140 views
1

我有一個列表的列表,看起來像這樣:格式化輸出寫列表時TEXTFILE

try: 
    file_name = open("dupe.txt", "w") 
except IOError: 
    pass 

for a in range (len(dupe)): 
    file_name.write(dupe[a][0] + " " + dupe[a][1] + " " + dupe[a][2] + "\n"); 

file_name.close() 

dupe = [['95d1543adea47e88923c3d4ad56e9f65c2b40c76', 'ron\\c', 'apa.txt'], ['95d1543adea47e88923c3d4ad56e9f65c2b40c76', 'ron\\c', 'knark.txt'], ['b5cc17d3a35877ca8b76f0b2e07497039c250696', 'ron\\a', 'apa2.txt'], ['b5cc17d3a35877ca8b76f0b2e07497039c250696', 'ron\\a', 'jude.txt']] 

我用一個非常基本的()函數將其寫入文件與文件中的輸出如下所示:

95d1543adea47e88923c3d4ad56e9f65c2b40c76 ron\c apa.txt 
95d1543adea47e88923c3d4ad56e9f65c2b40c76 ron\c knark.txt 
b5cc17d3a35877ca8b76f0b2e07497039c250696 ron\a apa2.txt 
b5cc17d3a35877ca8b76f0b2e07497039c250696 ron\a jude.txt 

但是,如何使輸出在dupe.txt文件看起來像t他:

95d1543adea47e88923c3d4ad56e9f65c2b40c76 ron\c apa.txt, knark.txt 
b5cc17d3a35877ca8b76f0b2e07497039c250696 ron\a apa2.txt, jude.txt 
+0

爲第二列始終是相同的,如果散列相等? (Smakfulla VAL AV filnamn,förövrigtVad的AR DET此項魔På富OCH吧:?P) – 2009-06-25 19:16:50

+0

這似乎是基本上爲http://stackoverflow.com/questions/1034145/python-list-question同樣的問題。 – 2009-06-25 19:19:03

回答

2

首先,小組由「鑰匙」線(前兩個元素每個陣列):

dupedict = {} 
for a, b, c in dupe: 
    dupedict.setdefault((a,b),[]).append(c) 

然後打印出來:

for key, values in dupedict.iteritems(): 
    print ' '.join(key), ', '.join(values) 
0

如果這是你的實際的回答,您可以:

  1. 輸出Per在欺騙每兩個元素一行。這很容易。或者,
  2. 如果你的數據不作爲結構化(所以你可能就可以使一本字典在您的長哈希是關鍵,和字符串的尾部是你的輸出。有意義嗎?

在認識上,意味着你可以像這樣:

tmp_string = "" 
for a in range (len(dupe)): 
if isOdd(a): 
    tmp_string = dupe[a][0] + " " + dupe[a][1] + " " + dupe[a][2] 
else: 
    tmp_string += ", " + dupe[a][2] 
    file_name.write(dupe[a][0] + " " + dupe[a][1] + " " + dupe[a][2] + "\n"); 

在觀念二,你可能有這樣的事情:

x=dict() 
for a in range(len(dupe)): 
    # check if the hash exists in x; bad syntax - I dunno "exists?" syntax 
    if (exists(x[dupe[a][0]])): 
     x[a] += "," + dupe[a][2] 
    else: 
     x[a] = dupe[a][0] + " " + dupe[a][1] + " " + dupe[a][2] 
for b in x: # bad syntax: basically, for every key in dictionary x 
    file_name.write(x[b]); 
0

使用字典將它們分組:

data = [['95d1543adea47e88923c3d4ad56e9f65c2b40c76', 'ron\\c', 'apa.txt'], \ 
    ['95d1543adea47e88923c3d4ad56e9f65c2b40c76', 'ron\\c', 'knark.txt'], \ 
    ['b5cc17d3a35877ca8b76f0b2e07497039c250696', 'ron\\a', 'apa2.txt'], \ 
    ['b5cc17d3a35877ca8b76f0b2e07497039c250696', 'ron\\a', 'jude.txt']] 

dupes = {} 
for row in data: 
    if dupes.has_key(row[0]): 
     dupes[row[0]].append(row) 
    else: 
     dupes[row[0]] = [row] 

for dupe in dupes.itervalues(): 
    print "%s\t%s\t%s" % (dupe[0][0], dupe[0][1], ",".join([x[2] for x in dupe])) 
1

我認爲你最後一個問題沒有解決你的問題?

而不是把每個列表與重複的ID和目錄列表獨立,爲什麼不把列表的文件元素包含所有具有相同ID和目錄中的文件另一個子列表。

這樣欺騙是這樣的:

dupe = [['95d1543adea47e88923c3d4ad56e9f65c2b40c76', 'ron\\c', ['apa.txt','knark.txt']], 
['b5cc17d3a35877ca8b76f0b2e07497039c250696', 'ron\\a', ['apa2.txt','jude.txt']] 

然後打印循環可能類似於:

for i in dupe: 
    print i[0], i[1], 
    for j in i[2] 
     print j, 
    print 
1
from collections import defaultdict 

dupe = [ 
    ['95d1543adea47e88923c3d4ad56e9f65c2b40c76', 'ron\\c', 'apa.txt'], 
    ['95d1543adea47e88923c3d4ad56e9f65c2b40c76', 'ron\\c', 'knark.txt'], 
    ['b5cc17d3a35877ca8b76f0b2e07497039c250696', 'ron\\a', 'apa2.txt'], 
    ['b5cc17d3a35877ca8b76f0b2e07497039c250696', 'ron\\a', 'jude.txt'], 
] 
with open("dupe.txt", "w") as f: 
    data = defaultdict(list) 
    for hash, dir, fn in dupe: 
    data[(hash, dir)].append(fn) 
    for hash_dir, fns in data.items(): 
    f.write("{0[0]} {0[1]} {1}\n".format(hash_dir, ', '.join(fns)))