Saya menggunakan Python 2.5, saya ingin enumerasi seperti itu (mulai dari 1 bukannya 0):
[(1, 2000), (2, 2001), (3, 2002), (4, 2003), (5, 2004)]
Saya tahu di Python 2.6 Anda dapat melakukan: h = enumerate (range (2000, 2005), 1) untuk memberikan hasil di atas tetapi dalam python2.5 Anda tidak bisa ...
Menggunakan python2.5:
>>> h = enumerate(range(2000, 2005))
>>> [x for x in h]
[(0, 2000), (1, 2001), (2, 2002), (3, 2003), (4, 2004)]
Apakah ada yang tahu cara untuk mendapatkan hasil yang diinginkan di python 2.5?
Terima kasih,
Jeff
Jawaban:
Seperti yang telah Anda sebutkan, ini mudah dilakukan di Python 2.6 atau yang lebih baru:
Python 2.5 dan yang lebih lama tidak mendukung
start
parameter jadi Anda bisa membuat dua objek rentang dan zip mereka:Hasil:
Jika Anda ingin membuat generator alih-alih daftar maka Anda dapat menggunakan izip sebagai gantinya.
sumber
izip
danxrange
akan lebih dekat untuk menyebutkanenumerate(iterable, start=1)
pada Python 2.6.Hanya untuk meletakkan ini di sini demi anak cucu, di 2.6 parameter "mulai" ditambahkan ke enumerasi seperti:
enumerate(sequence, start=1)
sumber
sequence[i]
dalam kode Anda.Mudah, cukup tentukan fungsi Anda sendiri yang melakukan apa yang Anda inginkan:
sumber
Python 3
Dokumentasi resmi:
enumerate(iterable, start=0)
Jadi Anda akan menggunakannya seperti ini:
sumber
Cara paling sederhana untuk dilakukan di Python 2.5 persis seperti yang Anda tanyakan:
Jika Anda ingin daftar, seperti yang terlihat, gunakan
zip
sebagai penggantiit.izip
.(BTW, sebagai aturan umum, cara terbaik untuk membuat daftar dari generator atau X lain yang bisa diubah bukan
[x for x in X]
, tetapi sebaliknyalist(X)
).sumber
Sekarang
h = list(enumerate(xrange(2000, 2005), 1))
bekerja.sumber
enumerate itu sepele, dan begitu juga mengimplementasikannya untuk menerima permulaan:
Perhatikan bahwa ini tidak memecahkan kode menggunakan enumerate tanpa argumen mulai.
Atau, oneliner ini mungkin lebih elegan dan mungkin lebih cepat, tetapi tidak menggunakan enumerasi lainnya:Yang terakhir adalah omong kosong. @Uncan punya pembungkus yang benar.
sumber
sumber
h = [(i + 1, x) for i, x in enumerate(xrange(2000, 2005))]
sumber
++
: itulah cara untuk melakukannyaOk, saya merasa sedikit bodoh di sini ... apa alasannya untuk tidak melakukannya dengan sesuatu seperti
[(a+1,b) for (a,b) in enumerate(r)]
? Jika Anda tidak akan berfungsi, tidak ada masalah juga:sumber
Karena ini agak bertele-tele, saya sarankan menulis fungsi Anda sendiri untuk menggeneralisasi:
sumber
Saya tidak tahu bagaimana pos-pos ini dapat dibuat lebih rumit daripada yang berikut ini:
sumber