Nella comprensione delle liste Python è possibile accedere all'indice degli elementi?


91

Considera il seguente codice Python con il quale aggiungo in modo nuovo list2tutti gli elementi con indici da 1 a 3 di list1:

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

Come scriveresti questo usando la comprensione delle liste, se non ho accesso agli indici tramite enumerate?

qualcosa di simile a:

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

ma dal momento che non ho indnumero, funzionerebbe?

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

3
Immagino che il tuo caso d'uso effettivo sia più complesso, ma potresti semplicemente tagliare list1[1:4]qui
wim

vuoi dire come se potessi tagliare la lista all'interno della lista di comprensione? come [x for x in list1[1:4]]:?
Pav Ametvic

@PavAmetvic, no @wim significa che puoi semplicemente scriverelist2 = list1[1:4]
John La Rooy

Risposte:



37

Se si utilizza enumerate, è fare avere accesso all'indice:

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

10

A meno che il tuo caso d'uso reale non sia più complicato, dovresti semplicemente usare una sezione di elenco come suggerito da @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']

Per casi più complicati, se non hai effettivamente bisogno dell'indice, è più chiaro iterare su una fetta o un'islice

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

o

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

Per piccole fette, il semplice list1[1:4]. Se le fette possono diventare abbastanza grandi potrebbe essere meglio usare un'isola per evitare di copiare la memoria


grazie ma dal momento che voglio eseguire un'operazione su 'x' all'interno della comprensione (diciamo x * x) prima di memorizzarla nella nuova lista, sembra che usare la fetta all'interno della comprensione della lista sia il modo migliore! grazie
Pav Ametvic

@PavAmetvic, ok quei casi sono ancora abbastanza semplici da non aver bisogno di enumerazione
John La Rooy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.