123

list2次のPythonコードを考えてみましょう。これを使用して、インデックスが1から3のすべてのアイテムを新しく追加しlist1ます。

for ind, obj in enumerate(list1):
    if 4 > ind > 0:
        list2.append(obj)

列挙によってインデックスにアクセスできない場合、リスト内包表記を使用してこれをどのように記述しますか?

何かのようなもの:

list2 = [x for x in list1 if 4 > ind > 0]

でも番号がないのでind、これでいいのでしょうか?

list2 = [x for x in enumerate(list1) if 4 > ind > 0]
4

4 に答える 4

224
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
于 2013-02-13T23:01:37.407 に答える
44

を使用すると、インデックスにアクセスできenumerateます

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]
于 2013-02-13T23:02:19.390 に答える
12

実際のユースケースがより複雑でない限り、@wimによって提案されたリストスライスを使用する必要があります

>>> list1 = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> [x for ind, x in enumerate(list1) if 4 > ind > 0]
['one', 'two', 'three']
>>> list1[1:4]
['one', 'two', 'three']

より複雑なケース(実際にインデックスが必要ない場合)では、スライスまたはisliceを反復処理する方が明確です。

list2 = [x*2 for x in list1[1:4]]

また

from itertools import islice
list2 = [x*2 for x in islice(list1, 1, 4)]

小さなスライスの場合、単純list1[1:4]です。スライスが非常に大きくなる可能性がある場合は、メモリのコピーを回避するためにisliceを使用する方がよい場合があります

于 2013-02-14T00:01:54.157 に答える
3

不思議に思う人のために、ユースケースで必要な場合は、リスト内包表記の結果と同じくらい簡単に一致するインデックスを保存できます。リスト内の各項目の値を評価して、それが何らかの値またはパターンに一致するかどうかを判断する必要があり、一致する値ではなく、後で処理するために一致するインデックスのリストを取得したい場合があります。

これは、以下に示すように実行できます。

>>> values = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> search = ['one', 'three', 'five']
>>> matches = [i for i, x in enumerate(values) if x in search]
>>> print(matches)
[1, 3, 5]

上記の重要な部分は、リスト内包でのパターンの使用です。ここでは、より一般的な列挙リスト内包パターンまたは代替の列挙リスト内包パターンを使用して達成される値ではなく[i for i, x in enumerate(l) if ...]、インデックスがキャプチャされます。ix[x for x in l if ...][x for i, x in enumerate(l) if ...]

于 2021-06-15T18:06:58.387 に答える