Запись ключа: пары значений в файл с разделителями табуляции с переменной # значений - PullRequest
3 голосов
/ 03 апреля 2012

Вопрос для начинающих: у меня есть словарь, в котором значения являются списками (переменная # of) строк.В конечном счете, я хотел бы записать каждую словарную запись в одну строку с разделителями табуляции с ключом в виде столбца 1 и отдельными элементами из списка значений в виде столбцов 2-n.Я использовал следующий код для генерации выходного файла с ключом в качестве столбца 1 и списком значений в качестве столбца 2, но я не уверен, что делать дальше.

mydict = {'spider':['kate', 'susan'],
          'fish':['kate'],
          'dog':['andy'], 
          'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
writer = csv.writer(f, delimiter = '\t')
for key, value in orfdict.iteritems():
    writer.writerow([orf] + [value])

Документация Python предлагаетчто вы можете использовать zip () для создания пары ключ-значение в форме списка, но когда я пытаюсь это сделать в интерактивном режиме:

>>> for key,value in mydict.iteritems():
...     mypair = zip(key,value)
...     print mypair

, я получаю этот странный вывод, поэтому я, очевидно, не понимаювещи:

[('f', 'kate')]
[('c', 'andy'), ('a', 'colby'), ('t', 'jeff')]
[('s', 'kate'), ('p', 'susan')]
[('d', 'andy')]

Самый простой способ сделать это - создать пустой список для каждой итерации по словарю, затем добавить в этот список сначала ключ, а затем каждое из значений с отступом.для цикла?Я чувствую, что, должно быть, что-то упустил.

Ответы [ 4 ]

5 голосов
/ 03 апреля 2012

Попробуйте добавить одно значение в существующий список:

writer.writerow([key] + value)

(key - это одно значение, value - это уже список)

2 голосов
/ 03 апреля 2012

Похоже, что вы переименовали некоторые из ваших переменных, а не переименовали другие, я предполагаю, что вы имели в виду пример кода для чтения:

mydict = {'spider':['kate', 'susan'],
          'fish':['kate'],
          'dog':['andy'], 
          'cat':['andy','colby','jeff']} 
f = open('outfile.txt', 'w') 
writer = csv.writer(f, delimiter = '\t')
for key, value in mydict.iteritems():
    writer.writerow([key] + [value])

csv writer кажется ненужным в этом случае, почему бы не использовать:

mydict = {'spider':['kate', 'susan'],
          'fish':['kate'],
          'dog':['andy'],
          'cat':['andy','colby','jeff']}
f = open('outfile.txt', 'w')
for key, value in mydict.iteritems():
    f.write('%s\t%s\n' % (key,'\t'.join(value)))
f.close()
0 голосов
/ 03 апреля 2012
>>> [(x, y) for x, x2 in mydict.iteritems() for y in x2]
[('fish', 'kate'), ('cat', 'andy'), ('cat', 'colby'), ('cat', 'jeff'), ('spider', 'kate'), ('spider', 'susan'), ('dog', 'andy')]
0 голосов
/ 03 апреля 2012

Попробуйте изменить цикл for следующим образом:

for key, value in orfdict.iteritems():
    writer.writerow([key] + value)

Поскольку значения в orfdict являются списками, на каждой итерации value будет списком.Например, в первой итерации key может быть 'spider', а value будет ['kate', 'susan'], поэтому [key] + value станет ['spider'] + ['kate', 'susan'] или ['spider', 'kate', 'susan'].

...