繁体   English   中英

解压缩与显式循环

[英]Unzip vs explicit loop

解压缩两个压缩列表的两种方法之间有什么区别?

assert isinstance(X, list)
assert isinstance(X[0], tuple)
assert isinstance(X[0][0], list)
assert isinstance(X[0][0][0], dict)

X_model = []
X_synth = []
for row in X:
    X_model.append(row[0])
    X_synth.append(row[1])

X_model现在是字典列表的列表

X_model, X_synth, = zip(*X)

X_model是字典列表的元组,结果不应该一样吗?

让我们举个例子。 为了简单起见,让我们使用数字而不是使用字典列表。 注意,每个元组的第一个元素是奇数,每个元组的第二个元素是偶数。

>>> X = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
>>> X_model = []
>>> X_synth = []
>>> for row in X:
...     X_model.append(row[0])
...     X_synth.append(row[1])
...
>>> X_model
[1, 3, 5, 7, 9]
>>> X_synth
[2, 4, 6, 8, 10]
>>> X_model, X_synth = zip(*X)
>>> X_model
(1, 3, 5, 7, 9)
>>> X_synth
(2, 4, 6, 8, 10)

让我们考虑zip(*X) zip(*X)等效于

zip((1, 2), (3, 4), (5, 6), (7, 8), (9, 10))

Python文档

zip:此函数返回一个元组列表 ,其中第i个元组包含每个参数序列或可迭代对象中的第i个元素。

因此zip将返回一个元组列表,其中第0个元组包含每个参数的第0个元素(所有奇数),第1个元组包含每个参数的所有第1个元素(所有偶数)

X_model, X_synth = [(1, 3, 5, 7, 9), (2, 4, 6, 8, 10)]

相当于zip()将是:

X_model = tuple(x for x, _ in X)
X_synth = tuple(x for _, x in X)

但这不是很有效,因为它会循环X次。 注意: tuple是不可变的,因此您不能像每次创建一个新元组那样有效地循环执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM