2017-04-01 8 views
0

2つの圧縮されたリストを解凍する2つの方法の違いは何ですか?明示的なループを解凍する

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 のリストのタプルが結果は同じであってはならないのですか?

答えて

1

例を使用してみましょう。簡潔にするために、dictsのリストを使用する代わりに、数字を使用しましょう。すべてのタプルの最初の要素が奇数であり、すべてのタプルの2番目の要素が偶数であることに注意してください。

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

ジップから

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

と等価である: この関数は、i番目のタプルは、引数のそれぞれからのi番目の要素が含まれているタプルのリストを返しますシーケンスまたはiterables。

は、従って、0番目のタプルは各引数(全て奇数)から0番目の要素を含み、第1のタプルは各引数(全て偶数)

からすべての第1元素を含むタプル
リストが返されジップ
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は不変です。そのたびに新しいタプルを作成するようにループ内で効率的に行うことはできません。

関連する問題