解压缩两个压缩列表的两种方法有什么区别?
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现在是dict列表的列表
X_model, X_synth, = zip(*X)
X_model是dicts列表的元组 结果应该不一样吗?
答案 0 :(得分:1)
让我们举个例子。为简单起见,不要使用词典列表,而是使用数字。注意每个元组的第一个元素是奇数,每个元组的第二个元素是偶数。
>>> 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)]
答案 1 :(得分:0)
等同于zip()
的是:
X_model = tuple(x for x, _ in X)
X_synth = tuple(x for _, x in X)
但这不是非常有效,因为它循环X
两次。
注意:tuple
是不可变的,因此您无法在循环中有效地执行此操作,因为每次都会创建一个新元组。