在ipython中加入两个列表时输出错误

时间:2015-09-18 18:10:57

标签: python csv ipython file-writing

我有两个列表 - list1打印时如下所示:

[['KR', 'Alabama', 111], ['KR', 'Alabama', 909], ['KR', 'Alabama', 90], ['KR', 'Alabama', 10], ['KR', 'Arizona', 12], ['KR', 'Arizona', 10], ['KR', 'Arizona', 93], ['KR', 'Arizona', 98],....]

打印时list2如下所示:

[11,110,108,....]

现在我想加入这两个列表并将结果写入csv文件,以便输出如下所示:

KR,Alabama,111,11
KR,Alabama,909,110
KR,Alabama,90,108
KR,Alabama,10,34
KR,Arizona,12,45

基本上list2的值成为csv文件中的第4列。我在ipython中编写了这段代码,但它以错误的格式生成输出,也没有写入文件中的所有记录(最后26条记录不在文件中):

final_list = zip(list1,list2)
print final_list

cdc_part1 = open("file1.csv", 'wb')
wr = csv.writer(cdc_part1, dialect='excel')

wr.writerows(final_list)

文件中的输出如下:

"['KR', 'Alabama', 111]",11
"['KR', 'Alabama', 909]",110
"['KR', 'Alabama', 90]",108
"['KR', 'Alabama', 10]",34
"['KR', 'Arizona', 12]",45

您可以注意到"项周围的[]list1以及list1中的字符串周围都有'。如何获得正确的输出格式以及为什么最后26条记录没有写入文件?

注意: list1list2以及我正在形成的final_list大小相同(300),但在档案中我只看到274条记录

3 个答案:

答案 0 :(得分:1)

由于list1是一个列表列表,因此执行zip(list1, list2)会产生以下结果:

[(['KR', 'Alabama', 111], 11),
 (['KR', 'Alabama', 909], 110),
 (['KR', 'Alabama', 90], 108)]

所以你需要在那里添加一个额外的步骤来将最后一个元素添加到第一个列表中。

final_list = [ a + [b] for a, b in zip(list1, list2) ]

这会让你,

[['KR', 'Alabama', 111, 11],
 ['KR', 'Alabama', 909, 110],
 ['KR', 'Alabama', 90, 108]]

这应该正确输出CSV。

答案 1 :(得分:0)

您使用的是错误的zip方式,请点击此处zip lists in python。 问题是zip连接输入列表中的元素,这里第一个列表中的元素本身就是一个列表,因此它连接到第二个列表中的元素。 正确的方法是

for each in xrange(0, len(list1)):
    list1[each].append[list2[each]]
print list1

答案 2 :(得分:0)

zip如何运作。来自the docs

  

返回元组的迭代器,其中第i个元组包含来自每个参数序列或迭代的第i个元素。

所以zip期望每个参数都是可迭代的。然后它将创建一个迭代(在python2列表中)的元组,抓取第i个元组的每个参数的第i个元素。因此,如果您将列表列表作为第一个参数传递而字符串列表作为第二个参数传递,那么您的最终项目将是一个元组,其中每个第一个元素是list1的内部列表,第二个元素是来自list2的相应索引字符串。

相反,你需要类似的东西:

final_list = [list1[i] + [list2[i]] for i in \
     range(min(len(list1),len(list2)))]

至于为什么最后26条记录不在文件中,来自zip文档:

  

当最短输入可迭代用尽时,迭代器停止

因此,您的list2元素比list1少26个元素。而不是猜测从list1添加到最后26个项目的内容,而不是在结果中包含它们。

注意:如上所述,在min()新配方中使用final_list会导致相同的短路行为

相关问题