代码之家  ›  专栏  ›  技术社区  ›  Anders

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

  •  1
  • Anders  · 技术社区  · 15 年前

    我有一个列表,如下所示:

    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 回复  |  直到 15 年前
        1
  •  2
  •   Alice Purcell    15 年前

    首先,按“键”(每个数组的前两个元素)对行进行分组:

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

    然后打印出来:

    for key, values in dupedict.iteritems():
      print ' '.join(key), ', '.join(values)
    
        2
  •  1
  •   Victor    15 年前

    我认为你的最后一个问题没有解决你的问题?

    与其将每个具有重复ID和目录的列表放在单独的列表中,不如将列表的文件元素设置为另一个子列表,该子列表包含具有相同ID和目录的所有文件。

    所以dupe应该是这样的:

    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
    
        3
  •  1
  •   Roger Pate    15 年前
    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)))
    
        4
  •  0
  •   Emil H    15 年前

    使用听写将他们分组:

    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]))
    
        5
  •  0
  •   montooner    15 年前

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

    1. 在dupe中每两个元素输出一行。这更容易。或者,
    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]);