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]

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:



37

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

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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.