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.