当列表包含某些内容时,为啥使用 zip() 只写入 CSV 文件?
Posted
技术标签:
【中文标题】当列表包含某些内容时,为啥使用 zip() 只写入 CSV 文件?【英文标题】:Why does using zip() only write to CSV file when list contains something?当列表包含某些内容时,为什么使用 zip() 只写入 CSV 文件? 【发布时间】:2016-01-18 18:25:03 【问题描述】:这是我第一次在这里提问,如果我没有正确格式化问题,请提前道歉。我也没有太多使用python的经验。
我正在编写将两个列表写入 CSV 文件的代码。代码的目的是让列表仅在它们都包含某些内容时才写入文件。
我一直在使用试错法,但发现在 python 3 中使用 ZIP
时这是可能的:
with open('file.csv', 'a') as f:
writer = csv.writer(f)
writer.writerows(zip(x,y))
f.close()
因此,如果 x
和 y
都包含某些内容,则两个列表都将写入 CSV 文件。但是,如果 x
和/或 y
不包含某些内容,则不会发生任何事情,这正是我希望代码工作的方式。
但是,我很难理解是为什么/如何使用ZIP
允许它工作。
非常感谢。有什么不清楚的地方很抱歉。
【问题讨论】:
zip
使用最短序列。如果要使用最长的序列,请使用itertools.izip_longest
。
@PeterWood 抱歉,请问最短序列到底是什么意思?
【参考方案1】:
zip
使用最短序列。来自文档:
zip([iterable, ...])
返回列表的长度被截断为最短参数序列的长度。
因此,如果您有一个空序列,您将一无所获:
>>> some = [1, 2, 3]
>>> empty = []
>>> zip(some, empty)
[]
如果您想使用最长的序列,请使用itertools.izip_longest
。缺失值默认填写None
,也可以指定新的fillvalue
:
itertools.izip_longest(*iterables[, fillvalue])
如果可迭代的长度不均匀,则用 fillvalue 填充缺失值。迭代一直持续到最长的可迭代对象用完
>>> from itertools import izip_longest
>>> some = [1, 2, 3]
>>> shorter = ['a', 'b']
>>> list(izip_longest(some, shorter))
[(1, 'a'), (2, 'b'), (3, None)]
【讨论】:
谢谢!帮助很大:) 抱歉,请问最短序列到底是什么意思?谢谢 @BenF97 编辑示例以上是关于当列表包含某些内容时,为啥使用 zip() 只写入 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章
System.Zip.TZipFile.ExtractZipFile 对某些文件抛出错误。为啥?