Dalam pemahaman daftar Python apakah mungkin untuk mengakses indeks item?

91

Pertimbangkan kode Python berikut yang saya tambahkan baru list2semua item dengan indeks dari 1 hingga 3 dari list1:

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

Bagaimana Anda akan menulis ini menggunakan pemahaman daftar, jika saya tidak memiliki akses ke indeks melalui enumerate?

sesuatu seperti:

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

tetapi karena saya tidak punya indnomor, apakah ini akan berhasil?

list2 = [x for x in enumerate(list1) if 4 > ind > 0]
Pav Ametvic
sumber
3
Saya kira kasus penggunaan Anda yang sebenarnya lebih kompleks, tetapi Anda bisa saja mengirisnya di list1[1:4]sini
wim
Maksud Anda seperti saya bisa memotong daftar di dalam pemahaman daftar? seperti [x for x in list1[1:4]]:?
Pav Ametvic
@PavAmetvic, tidak @wim berarti Anda bisa menulislist2 = list1[1:4]
John La Rooy

Jawaban:

183
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
Pavel Anossov
sumber
37

Jika Anda menggunakan enumerate, Anda lakukan memiliki akses ke indeks:

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

Kecuali kasus penggunaan Anda yang sebenarnya lebih rumit, Anda sebaiknya menggunakan potongan daftar seperti yang disarankan oleh @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']

Untuk kasus yang lebih rumit - jika Anda tidak benar-benar membutuhkan indeks - akan lebih jelas untuk melakukan iterasi pada slice atau islice

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

atau

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

Untuk irisan kecil, sederhana list1[1:4]. Jika irisan menjadi cukup besar, mungkin lebih baik menggunakan islice untuk menghindari penyalinan memori

John La Rooy
sumber
terima kasih tetapi karena saya ingin melakukan operasi pada 'x' di dalam pemahaman (katakanlah x * x) sebelum saya menyimpannya di dalam daftar baru, sepertinya menggunakan potongan di dalam pemahaman daftar adalah cara terbaik! terima kasih
Pav Ametvic
@PavAmetvic, ok kasus-kasus itu masih cukup sederhana sehingga tidak perlu pencacahan
John La Rooy