将列表写入文本文件时格式化输出

时间:2009-06-25 19:11:37

标签: python list

我有一个列表如下:

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

我使用非常基本的函数()将其写入文件:

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()

文件中的输出如下所示:

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

但是,如何使dupe.txt文件中的输出看起来像这样:

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

5 个答案:

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

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

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

答案 3 :(得分:0)

如果这是您的实际答案,您可以:

  1. 在dupe中每两个元素输出一行。这更容易。或者,
  2. 如果您的数据不是结构化的(那么您可以创建一个字典,其中您的长哈希是关键,字符串的尾端是您的输出。有意义吗?
  3. 在第一个想法中,意味着你可以这样:

    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]);
    

答案 4 :(得分:0)

使用dict对它们进行分组:

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]))