4

初学者问题:我有一本字典,其中的值是(变量# 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')]

最简单的方法是为字典的每次迭代创建一个空列表,然后首先将键附加到该列表,然后每个值都带有缩进的 for 循环?我觉得我一定是错过了什么。

4

4 回答 4

5

试试这个向现有列表添加一个值:

writer.writerow([key] + value)

key是单个值,value已经是一个列表)

于 2012-04-02T22:47:20.427 回答
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 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()
于 2012-04-03T01:30:45.267 回答
0

尝试将您的 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']

于 2012-04-02T22:48:22.157 回答
0
>>> [(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')]
于 2012-04-02T22:49:22.623 回答