[英]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))
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.