Форматирование вывода при записи списка в текстовый файл - PullRequest
1 голос
/ 25 июня 2009

У меня есть список списков, который выглядит следующим образом:

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 ]

2 голосов
/ 25 июня 2009

Сначала сгруппируйте строки по «ключу» (первые два элемента каждого массива):

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 голос
/ 25 июня 2009
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)))
1 голос
/ 25 июня 2009

Я так понимаю, ваш последний вопрос не решил вашу проблему?

вместо того, чтобы помещать каждый список с повторяющимися идентификаторами и каталогами в отдельные списки, почему бы не сделать элемент файла списка другим подсписком, который содержит все файлы с одинаковыми идентификатором и каталогом.

так что дупе будет выглядеть так:

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
0 голосов
/ 25 июня 2009

Используйте диктовку, чтобы сгруппировать их:

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]))
0 голосов
/ 25 июня 2009

Если это ваш фактический ответ, вы можете:

  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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...