Czy w zrozumieniu list w Pythonie można uzyskać dostęp do indeksu pozycji?


91

Rozważmy następujący kod Pythona, za pomocą którego dodaję nowe list2wszystkie elementy o indeksach od 1 do 3 list1:

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

Jak byś to napisał, używając funkcji rozumienia list, skoro nie mam dostępu do indeksów poprzez wyliczanie?

coś jak:

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

ale skoro nie mam indnumeru, czy to zadziała?

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

3
Wydaje mi się, że twój rzeczywisty przypadek użycia jest bardziej złożony, ale możesz po prostu ciąć list1[1:4]tutaj
wim

masz na myśli, jakbym mógł wyciąć listę w ramach rozumienia listy? jak [x for x in list1[1:4]]:?
Pav Ametvic

@PavAmetvic, nie @wim oznacza, że ​​możesz po prostu pisaćlist2 = list1[1:4]
John La Rooy,

Odpowiedzi:



37

Jeśli używasz enumerate, możesz zrobić mieć dostęp do indeksu:

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

10

O ile twój prawdziwy przypadek użycia nie jest bardziej skomplikowany, powinieneś po prostu użyć wycinka listy zgodnie z sugestią @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']

W bardziej skomplikowanych przypadkach - jeśli faktycznie nie potrzebujesz indeksu - jaśniej jest iterować po wycinku lub wysepce

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

lub

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

Na małe plasterki proste list1[1:4]. Jeśli plasterki mogą stać się dość duże, lepiej użyć islice, aby uniknąć kopiowania pamięci


dzięki, ale ponieważ chcę wykonać operację na 'x' wewnątrz rozumienia (powiedzmy x * x), zanim zapiszę go na nowej liście, wygląda na to, że użycie wycinka wewnątrz rozumienia listy jest najlepszym sposobem! dzięki
Pav Ametvic

@PavAmetvic, ok, te przypadki są nadal na tyle proste, że nie wymagają wyliczania
John La Rooy,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.