Pythonリスト内包表記では、アイテムインデックスにアクセスできますか?


91

次のPythonコードを考えてみましょう。これを使用して、list2インデックスが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]

3
実際のユースケースはもっと複雑だと思いますが、list1[1:4]ここで単純にスライスすることもできます
2013

リスト内包内でリストをスライスできるような意味ですか?のように:[x for x in list1[1:4]]
Pav Ametvic 2013

@ PavAmetvic、@ wimがないということは、あなたがただ書くことができるという意味ですlist2 = list1[1:4]
John La Rooy 2013

回答:



37

あなたが使用している場合はenumerate、あなたが行うインデックスへのアクセス権を持っています:

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

10

実際のユースケースがより複雑でない限り、@ 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を使用する方がよい場合があります


おかげで、新しいリスト内に格納する前に、内包内の「x」(たとえばx * x)に対して操作を実行したいので、リスト内包内のスライスを使用するのが最善の方法のようです!ありがとう
Pav Ametvic 2013

@PavAmetvic、わかりました、これらのケースはまだ列挙を必要としないほど単純です
John La Rooy 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.