Katakanlah saya memiliki daftar a
dalam Python yang entri-entrinya mudah dipetakan ke kamus. Setiap elemen genap mewakili kunci kamus, dan elemen ganjil berikut adalah nilainya
sebagai contoh,
a = ['hello','world','1','2']
Dan saya ingin mengonversinya ke kamus b
, di mana
b['hello'] = 'world'
b['1'] = '2'
Apa cara terbersih secara sintaksis untuk mencapai ini?
python
list
dictionary
Mike
sumber
sumber
Jawaban:
Jika
a
besar, Anda mungkin ingin melakukan sesuatu seperti yang berikut, yang tidak membuat daftar sementara seperti di atas.Dalam Python 3 Anda juga bisa menggunakan pemahaman dict, tetapi ironisnya saya pikir cara paling sederhana untuk melakukannya adalah dengan
range()
danlen()
, yang biasanya berupa bau kode.Jadi
iter()/izip()
metode ini mungkin masih yang paling Pythonic di Python 3, meskipun seperti yang dicatat dalam komentar EOL,zip()
sudah malas di Python 3 jadi Anda tidak perluizip()
.Jika Anda menginginkannya dalam satu baris, Anda harus menipu dan menggunakan titik koma. ;-)
sumber
zip(i, i)
, dalam Python 3, karenazip()
sekarang mengembalikan iterator.Jawaban sederhana
Pilihan lain (milik Alex Martelli - sumber ):
Catatan terkait
Jika Anda memiliki ini:
dan Anda menginginkan ini (setiap elemen daftar memasukkan nilai yang diberikan (2 dalam kasus ini)):
kamu bisa memakai:
sumber
fromkeys
.>>> dict.fromkeys(a, 2) {'bi': 2, 'double': 2, 'duo': 2, 'two': 2}
Anda dapat menggunakan pemahaman dict untuk ini dengan cukup mudah:
Ini sama dengan for loop di bawah ini:
sumber
Sesuatu yang saya temukan cukup keren, yaitu jika daftar Anda hanya 2 item:
Ingat, dict menerima setiap iterable yang berisi iterable di mana setiap item di iterable itu sendiri harus iterable dengan tepat dua objek.
sumber
Mungkin bukan yang paling pythonic, tapi
sumber
enumerate
for i, key in enumerate(a[::2]):
. Masih unpythonic karena konstruktor dikt dapat melakukan sebagian besar pekerjaan di sini untuk Andafor i, key in enumerate(a[::2]):
pendekatan itu bekerja? Nilai pasangan yang dihasilkan akan0 hello
dan1 1
, dan tidak jelas bagi saya bagaimana menggunakannya untuk menghasilkan{'hello':'world', '1':'2'}
.enumerate(a)[::2]
Anda dapat melakukannya dengan cukup cepat tanpa membuat array tambahan, jadi ini akan bekerja bahkan untuk array yang sangat besar:
Jika Anda memiliki generator
a
, lebih baik lagi:Inilah rundown:
sumber
{'hello':'hello','world':'world','1':'1','2':'2'}
)Anda juga dapat melakukannya seperti ini (string ke daftar konversi di sini, lalu konversi ke kamus)
sumber
Saya juga sangat tertarik untuk memiliki satu-liner untuk konversi ini, sejauh daftar tersebut adalah penginisialisasi default untuk hash di Perl.
Jawaban yang sangat komprehensif diberikan di utas ini -
Milik saya, saya pemula di Python), menggunakan Python 2.7 Generator Expressions , akan menjadi:
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
sumber
Saya tidak yakin apakah ini pythonic, tetapi sepertinya berhasil
sumber
coba kode di bawah ini:
sumber
Anda juga dapat mencoba pendekatan ini menyimpan kunci dan nilai dalam daftar yang berbeda dan kemudian menggunakan metode dict
keluaran:
sumber
sumber