Mendapatkan: TypeError: 'dict_values' objek tidak mendukung pengindeksan ketika menggunakan python 3.2.3

Ini kode saya:

{names[i]:d.values()[i] for i in range(len(names))}

Ini bekerja benar-benar baik-baik saja ketika menggunakan python 2.7.3; namun, ketika saya menggunakan python 3.2.3, saya mendapatkan pesan kesalahan yang menyatakan 'dict_values' objek tidak mendukung pengindeksan. Bagaimana saya bisa memodifikasi kode untuk membuatnya kompatibel untuk 3.2.3?

Mengomentari pertanyaan (4)
Larutan

Di Python 3, dict.nilai-nilai() (bersama dengan dict.kunci-kunci() dan dict.item()) kembali view, daripada sebuah daftar. Lihat dokumentasi di sini. Oleh karena itu anda perlu untuk membungkus panggilan anda untuk dict.nilai-nilai() dalam panggilan untuk daftar seperti:

v = list(d.values())
{names[i]:v[i] for i in range(len(names))}
Komentar (4)

Sebuah versi sederhana dari kode anda akan sama:

dict(zip(names, d.values()))

Jika anda ingin menyimpan struktur yang sama, anda dapat mengubahnya ke:

vlst = list(d.values())
{names[i]: vlst[i] for i in range(len(names))}

(Anda dapat dengan mudah menempatkan daftar(d.nilai-nilai()) dalam pemahaman bukan vlst; it's hanya boros untuk melakukannya karena itu akan kembali membuat daftar setiap waktu).

Komentar (7)

Di Python 3 dict.nilai-nilai() kembali metode kamus view object, tidak daftar di Python 2. Kamus pandangan yang memiliki panjang, dapat iterasi, dan mendukung keanggotaan pengujian, tapi don't mendukung pengindeksan.

Untuk membuat kode anda bekerja pada kedua versi, anda bisa menggunakan salah satu dari ini:

{names[i]:value for i,value in enumerate(d.values())}

    atau

values = list(d.values())
{name:values[i] for i,name in enumerate(names)}

Oleh jauh yang paling sederhana, cara tercepat untuk melakukan hal yang sama dalam kedua versi akan sama:

dict(zip(names, d.values()))

Namun perlu dicatat, bahwa semua metode ini akan memberikan anda hasil yang akan bervariasi tergantung pada isi sebenarnya dari d. Untuk mengatasi itu, anda mungkin dapat menggunakan OrderedDict sebaliknya, yang mengingat urutan tombol yang pertama dimasukkan ke dalamnya, sehingga anda dapat mengandalkan pesanan dari apa yang dikembalikan oleh nilai-nilai() metode.

Komentar (1)