2

Python 3 学習者はこちら:

質問には、次の受け入れられた回答がありました。

rr,tt = zip(*[(i*10, i*12) for i in xrange(4)])

2 つのタプルを返します。誰かが答えを分析し、Python 3 を念頭に置いて何をしているのかを説明できれば幸いです (Python 3 でrange()イテレータが返されることはわかっています)。リストの内包表記は理解できますが、アンパックについては混乱しています (割り当てターゲットの一部としてスター付きの式しか使用できないと思っていました)。

以下のコードでも同様に混乱しています。私は結果と圧縮を理解しています (または理解していると思います)。

x2, y2 = zip(*zip(x, y))

これから:_

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True
4

1 に答える 1

7

*expression関数呼び出しに引数のアンパックを適用します。iterable に解決する必要がexpressionある部分を取り、その iterable 内の各要素を関数の個別のパラメーターにします。

そのためzip(x, y)、反復子 (反復可能) が返され、その反復子の各要素が外部 zip()関数の引数になります。

zip(*[(i*10, i*12) for i in xrange(4)])おそらくもう少し明確です。ここにはいくつかの要素があります。

  • [(i*10, i*12) for i in xrange(4)] range()( python 3にあるはずです) 4つのタプルを持つリストを作成し、[(0, 0), (10, 12), (20, 24), (30, 36)]
  • 次に、zip(*...)パーツはこれら 4 つのタプルのそれぞれを受け取り、それらを引数としてzip()関数に渡します。
  • zip()各タプルを取り、それらの要素をペアにします。タプルごとに 2 つの要素は、結果がそれぞれ 4 つの値の 2 つのリストであることを意味します。

関数は 2 つのシーケンスを生成するためzip()、それらを 2 つの変数に割り当てることができます。

以下は、同じ式のはるかに読みやすいバージョンであることがわかりました。

rr, tt = tuple(range(0, 40, 10)), tuple(range(0, 48, 12))
于 2013-03-29T15:25:52.760 に答える