1
list(zip(['A','B','C'], [x for x in range(1,4)]))

上記を書き直して、そのzipを理解の中に入れたいと思います。以下に試してみます:

[list(zip(['A','B','C'], x) for x in range(1,4))]

また [zip(['A','B','C'], x) for x in range(1,4)]

それは機能せず、TypeError: zip argument #2 must support iteration が発生します

どこが間違っていたのか分かりますか?

4

3 に答える 3

3

[x for x in range(1,4)]は にすぎないlist(range(1, 4))ので、次を使用します。

list(zip(['A', 'B', 'C'], range(1, 4)))

そしてそれで終わります。

リスト内包表記を使用する必要ある場合は、次のlist()呼び出しを置き換えます。

[(x, y) for x, y in zip(['A', 'B', 'C'], range(1, 4))]

しかし、それは内部リスト内包表記と同じくらい冗長です。

あなたがやろうとしているのはzip()、シーケンスのみを取る関数に個々の要素を渡すことです。

于 2013-07-13T13:37:18.413 に答える
2

map()渡された引数を圧縮する の機能を実際に使用できます。

>>> map(None, ['A','B','C'], range(1,4)) # For python 2.x only
[('A', 1), ('B', 2), ('C', 3)]

コードのエラーは、イテレータではなく、zip の 2 番目の引数に数値を渡していることです。

于 2013-07-13T13:38:19.063 に答える
0

使用することもできます

>>> some_list = ['A', 'B', 'C']
>>> enumerate(some_list)

これにより、ゼロから始まり、リストではなく Iterable として逆の順序でペアが得られます(0, 'A'), (1, 'B'), (2, 'C')(Interable の方が効率的であることがよくあります)。特に 1 から開始したい場合は、開始値を渡して 2 番目の引数として列挙し、後でリストに変換することもできます。

>>> list(enumerate(some_list, 1))
[(1, 'A'), (2, 'B'), (3, 'C')]

ただし、これにより、ペアが逆の順序で質問されます。

この手法は、リストからインデックスと要素が必要な場合に一般的です。

>>> for i, c in enumerate('ABC'):
...     print i, c
...
0 A
1 B
2 C
于 2013-07-13T13:54:08.390 に答える