当列表包含某些内容时,为啥使用 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()

因此,如果 xy 都包含某些内容,则两个列表都将写入 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 对某些文件抛出错误。为啥?

为啥包含 300 张图像的应用程序停止工作?

为啥当我追加到其中的列表时,元组的内容会发生变化,但在更新变量时不会发生变化?

zip

当某些项目相互依赖时,如何运行异步进程列表?

MS Access:为啥我的组合框显示错误的值?