Python listesinin anlaşılmasında öğe dizinine erişmek mümkün müdür?


91

list21'den 3'e kadar indeksli tüm öğeleri yeni bir şekilde eklediğim aşağıdaki Python kodunu düşünün list1:

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

Numaralandırma yoluyla endekslere erişimim yoksa, bunu liste anlama kullanarak nasıl yazarsınız?

gibi bir şey:

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

ama indnumaram olmadığına göre , bu işe yarar mı?

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

3
Sanırım gerçek kullanım durumunuz daha karmaşık, ancak list1[1:4]burada dilimleme yapabilirsiniz
wim

Listeyi, liste kapsamı içinde bölebileceğim gibi mi? gibi [x for x in list1[1:4]]:?
Pav Ametvic

@PavAmetvic, hayır @wim sadece yazabileceğin anlamına gelirlist2 = list1[1:4]
John La Rooy

Yanıtlar:



37

Eğer kullanırsanız enumerate, sen yapmak endeksi erişebilir:

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

10

Gerçek kullanım durumunuz daha karmaşık olmadıkça, @wim tarafından önerilen bir liste dilimi kullanmalısınız.

>>> 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']

Daha karmaşık durumlar için - gerçekten dizine ihtiyacınız yoksa - bir dilim veya bir adacık üzerinde yineleme yapmak daha açıktır.

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

veya

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

Küçük dilimler için basit list1[1:4]. Dilimler oldukça büyüyebiliyorsa, belleği kopyalamaktan kaçınmak için bir dilim kullanmak daha iyi olabilir.


teşekkürler, ancak yeni listeye kaydetmeden önce anlamanın içindeki 'x' üzerinde bir işlem yapmak istediğim için (x * x diyelim), liste kavrama içindeki dilimi kullanmak en iyi yol gibi görünüyor! teşekkürler
Pav Ametvic

@PavAmetvic Tamam o vakalar değil ihtiyaç numaralandırma için hala yeterince basit olan
John La Rooy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.