解压缩与显式循环

时间:2017-04-01 15:11:11

标签: python

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

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

2 个答案:

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

来自Python Docs

  

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是不可变的,因此您无法在循环中有效地执行此操作,因为每次都会创建一个新元组。