HOWTO · Python
在 Python 中从多个列表和元组创建元组列表
了解如何在 Python 中从多个列表和元组创建元组列表
本页内容
使用 list(zip(values_a, values_b, ...)) 可以配对相同位置的值,并将结果具体化为元组列表。内置函数 zip() 接受列表、元组和其他可迭代对象,因此通常是 Python 中组合对应值最清晰的方式。
本文使用 Python 3.14.7,介绍等长输入、不同长度输入的默认行为、严格验证,以及输入更长时保留每一行的方法。
zip() 返回什么
zip() 生成的每个元素都是包含各输入一个值的元组。zip 对象是惰性的,迭代时才生成元组。需要打印、索引或重复使用时,用 list() 将其具体化。
输入可以混合列表和元组。配对按位置进行,元组长度等于输入可迭代对象的数量。
从等长输入创建元组列表
下面的示例将数字列表与字母元组组合。list(zip(...)) 会消耗惰性迭代器并返回元组列表。
values = list(zip([1, 2, 3], ("a", "b", "c")))
print(values)
输出:
[(1, 'a'), (2, 'b'), (3, 'c')]
等长输入的每个位置都有一个元组。该操作不需要第三方包,输出列表的空间与元组数量成正比。只需迭代一次时请保留惰性的 zip 对象。
处理不同长度的输入
默认情况下,zip() 在最短输入耗尽时停止。需要忽略多余值时很方便,但在所有输入都应等长时可能隐藏缺失数据。等长是约束时使用 strict=True,长度不同时 Python 会引发 ValueError。
try:
list(zip([1, 2, 3], ("a", "b"), strict=True))
except ValueError as error:
print(type(error).__name__, str(error))
输出:
ValueError zip() argument 2 is shorter than argument 1
strict=True 从 Python 3.10 起可用。它适合必须保持对齐的记录;请处理 ValueError 或先验证输入。
使用 itertools.zip_longest() 保留每个输入行
结果必须包含最长输入的位置时,使用 itertools.zip_longest() 而不是默认的 zip()。未提供 fillvalue 时,缺失位置填入 None。请选择不会与真实值混淆的标记。
例如,list(itertools.zip_longest(first, second, fillvalue="missing")) 保留所有位置并标记缺失值。按最短输入截断会丢弃一行时,这是正确的边界行为。
需要明确控制时手动构建列表
手动索引方法适合验证输入必须是 list 或 tuple,或需要在配对逻辑旁使用自定义规则的情况。可执行的备用方案 convert = lambda *args: [] if not all(isinstance(value, (list, tuple)) for value in args) else [tuple(value[index] for value in args) for index in range(min((len(value) for value in args), default=0))] 保留验证并在最短输入处停止。对于示例中的四个值,它返回 [(1.1, 'H', True, 100), (2.2, 'E', False, 200), (3.3, 'L', False, 300)]。
该函数拒绝类型既不是 list 也不是 tuple 的参数,然后在最短输入处停止。最短长度为 m、输入数为 n 时,时间和结果空间均为 O(m * n)。
选择合适的方法
普通位置配对需要具体化结果时使用 list(zip(...)),单次迭代时使用惰性的 zip()。长度不同表示数据无效时用 strict=True,不能丢弃行时用带明确填充值的 itertools.zip_longest()。手动方法是自定义规则的备用方案。