在 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 条记录没有写入文件?
注意: list1
、list2
以及我正在形成的 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
所以你的 list2
比 list1
少了 26 个元素。与其猜测要向 list1
的最后 26 个项目添加什么,它只是不将它们包含在结果中。
注意: 在新的 final_list
公式中使用 min()
将导致相同的短路行为
我有两个列表 - 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 条记录没有写入文件?
注意: list1
、list2
以及我正在形成的 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
所以你的 list2
比 list1
少了 26 个元素。与其猜测要向 list1
的最后 26 个项目添加什么,它只是不将它们包含在结果中。
注意: 在新的 final_list
公式中使用 min()
将导致相同的短路行为