Python menggunakan enumerate di dalam daftar pemahaman

125

Mari kita anggap saya memiliki daftar seperti ini:

mylist = ["a","b","c","d"]

Untuk mendapatkan nilai yang dicetak bersama dengan indeks mereka, saya dapat menggunakan enumeratefungsi Python seperti ini

>>> for i,j in enumerate(mylist):
...     print i,j
...
0 a
1 b
2 c
3 d
>>>

Sekarang, ketika saya mencoba menggunakannya di dalam list comprehensionitu memberi saya kesalahan ini

>>> [i,j for i,j in enumerate(mylist)]
  File "<stdin>", line 1
    [i,j for i,j in enumerate(mylist)]
           ^
SyntaxError: invalid syntax

Jadi, pertanyaan saya adalah: apa cara yang benar untuk menggunakan enumerate dalam pemahaman daftar?

RanRag
sumber

Jawaban:

166

Coba ini:

[(i, j) for i, j in enumerate(mylist)]

Anda perlu memasukkan i,jtuple agar pemahaman daftar berfungsi. Atau, mengingat yang enumerate() sudah mengembalikan tuple, Anda dapat mengembalikannya langsung tanpa membukanya terlebih dahulu:

[pair for pair in enumerate(mylist)]

Either way, hasil yang dikembalikan seperti yang diharapkan:

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
Óscar López
sumber
4
Tidak wajib menjadi tuple. Ekspresi apa pun yang menggunakan i dan j yang mengembalikan nilai akan dilakukan
Alvaro
penggunaan pencacahan itu bagus, bagaimana kalau membuatnya lebih efisien menggunakan itertools
Pramit
3
Hanya ingat bahwa tupel dibangun oleh , tidak yang (). Jadi "memasukkan ke i,jdalam tuple" tidak masuk akal, karena i,jsudah menjadi tupel! Masalahnya adalah daftar pengurai kebutuhan parens untuk grup pernyataan.
cowbert
46

Hanya untuk benar-benar jelas, ini tidak ada hubungannya dengan enumeratedan semuanya berkaitan dengan sintaksis pemahaman daftar.

Pemahaman daftar ini mengembalikan daftar tupel:

[(i,j) for i in range(3) for j in 'abc']

ini daftar dicts:

[{i:j} for i in range(3) for j in 'abc']

daftar daftar:

[[i,j] for i in range(3) for j in 'abc']

kesalahan sintaksis:

[i,j for i in range(3) for j in 'abc']

Yang tidak konsisten (IMHO) dan membingungkan dengan sintaks pemahaman kamus:

>>> {i:j for i,j in enumerate('abcdef')}
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}

Dan satu set tupel:

>>> {(i,j) for i,j in enumerate('abcdef')}
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')])

Seperti yang dinyatakan oleh Óscar López, Anda bisa langsung melewatkan tomel enumerasi:

>>> [t for t in enumerate('abcdef') ] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]
serigala
sumber
32

Atau, jika Anda tidak bersikeras menggunakan pemahaman daftar:

>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
pembuat pil
sumber
12

Jika Anda menggunakan daftar panjang, tampaknya pemahaman daftar lebih cepat, belum lagi lebih mudah dibaca.

~$ python -mtimeit -s"mylist = ['a','b','c','d']" "list(enumerate(mylist))"
1000000 loops, best of 3: 1.61 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[(i, j) for i, j in enumerate(mylist)]"
1000000 loops, best of 3: 0.978 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[t for t in enumerate(mylist)]"
1000000 loops, best of 3: 0.767 usec per loop
jenggot
sumber
2
+1 Saya tidak mengujinya, tetapi saya bertaruh [t for t in enumerate(my list)]bahkan lebih cepat.
serigala
11

Inilah cara untuk melakukannya:

>>> mylist = ['a', 'b', 'c', 'd']
>>> [item for item in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Atau, Anda dapat melakukan:

>>> [(i, j) for i, j in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Alasan Anda mendapatkan kesalahan adalah karena Anda melewatkan () di sekitarnya idan jmenjadikannya tupel.

Simeon Visser
sumber
6

Jelaskan secara eksplisit tentang tupel.

[(i, j) for (i, j) in enumerate(mylist)]
Ignacio Vazquez-Abrams
sumber
0

Semua jawaban bagus kawan. Saya tahu pertanyaan di sini khusus untuk pencacahan tetapi bagaimana dengan sesuatu seperti ini, hanya perspektif lain

from itertools import izip, count
a = ["5", "6", "1", "2"]
tupleList = list( izip( count(), a ) )
print(tupleList)

Ini menjadi lebih kuat, jika seseorang harus mengulang beberapa daftar secara paralel dalam hal kinerja. Hanya pemikiran saja

a = ["5", "6", "1", "2"]
b = ["a", "b", "c", "d"]
tupleList = list( izip( count(), a, b ) )
print(tupleList)
Pramit
sumber