2017-04-01 43 views
0

解压缩两个压缩列表的两种方式有什么区别?解压缩与显式循环

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是类型的字典列表的元组 不应该的结果是一样的吗?

回答

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)) 

Python Docs

ZIP: 此函数返回的元组的列表,其中第i个元组包含来自每个参数的第i个元素序列或迭代。

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

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

相当于zip()是:

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

但这并不是因为它的周期X非常有效两次。 注意:tuple是不可变的,所以你不能在循环中有效地完成它,因为你每次都会创建一个新的元组。