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

wrong output while joining two lists in ipython

我有两个列表 - 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 条记录

由于 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。

您使用 zip 的方式不对,有关更多信息,请查看此处 zip lists in python。 问题是 zip 连接了输入列表中的元素,这里第一个列表中的元素本身是一个列表,因此它连接到第二个列表中的元素。 正确的做法是

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

一切都在于 zip 的运作方式。来自 the docs

Returns an iterator of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables.

所以 zip 期望每个参数都是可迭代的。然后它将创建一个可迭代的(在 python2 列表中)的元组,为第 i 个元组获取每个参数的第 i 个元素。所以如果你传入一个列表列表作为第一个参数,一个字符串列表作为第二个参数,你的最终项目将是一个元组,其中每个第一个元素是 list1 的内部列表,第二个元素是来自 list2.

的相应索引字符串

相反,你想要这样的东西:

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

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

The iterator stops when the shortest input iterable is exhausted

所以你的 list2list1 少了 26 个元素。与其猜测要向 list1 的最后 26 个项目添加什么,它只是不将它们包含在结果中。

注意: 在新的 final_list 公式中使用 min() 将导致相同的短路行为