Katakanlah saya memiliki kode berikut:
import collections
d = collections.OrderedDict()
d['foo'] = 'python'
d['bar'] = 'spam'
Apakah ada cara saya dapat mengakses item dengan cara bernomor, seperti:
d(0) #foo's Output
d(1) #bar's Output
Katakanlah saya memiliki kode berikut:
import collections
d = collections.OrderedDict()
d['foo'] = 'python'
d['bar'] = 'spam'
Apakah ada cara saya dapat mengakses item dengan cara bernomor, seperti:
d(0) #foo's Output
d(1) #bar's Output
Jika OrderedDict()
Anda dapat dengan mudah mengakses elemen dengan mengindeks dengan mendapatkan tupel pasangan (kunci, nilai) sebagai berikut
>>> import collections
>>> d = collections.OrderedDict()
>>> d['foo'] = 'python'
>>> d['bar'] = 'spam'
>>> d.items()
[('foo', 'python'), ('bar', 'spam')]
>>> d.items()[0]
('foo', 'python')
>>> d.items()[1]
('bar', 'spam')
Catatan untuk Python 3.X
dict.items
akan mengembalikan objek tampilan dict yang dapat diubah daripada daftar. Kita perlu memasukkan panggilan ke daftar untuk memungkinkan pengindeksan
>>> items = list(d.items())
>>> items
[('foo', 'python'), ('bar', 'spam')]
>>> items[0]
('foo', 'python')
>>> items[1]
('bar', 'spam')
items
metode mengembalikan objek tampilan kamus interable daripada daftar, dan tidak mendukung slicing atau pengindeksan. Jadi, Anda harus mengubahnya menjadi daftar terlebih dahulu. docs.python.org/3.3/library/stdtypes.html#dict-viewslist(d.items())
list(d.items())
dengan menggunakannext(islice(d.items(), 1))
untuk mendapatkan('bar', 'spam')
Apakah Anda harus menggunakan OrderedDict atau Anda secara spesifik menginginkan tipe seperti peta yang dipesan dengan cara tertentu dengan pengindeksan posisi cepat? Jika yang terakhir, maka pertimbangkan salah satu dari banyak jenis dict diurutkan Python (yang memesan pasangan nilai kunci berdasarkan urutan kunci). Beberapa implementasi juga mendukung pengindeksan cepat. Misalnya, proyek Sortcontainers memiliki tipe SortedDict hanya untuk tujuan ini.
sumber
SortedDict
dengan fungsi tombol untuk menghindari perbandingan. Seperti:SortedDict(lambda key: 0, ...)
. Kunci kemudian tidak akan disortir tetapi akan tetap dalam urutan stabil dan dapat diindeks.Ini adalah kasus khusus jika Anda ingin entri pertama (atau dekat dengan itu) di dalam OrderedDict, tanpa membuat daftar. (Ini telah diperbarui ke Python 3):
(Pertama kali Anda mengatakan "next ()", itu benar-benar berarti "pertama.")
Dalam tes informal saya,
next(iter(d.items()))
dengan OrderedDict kecil hanya sedikit lebih cepat daripadaitems()[0]
. Dengan OrderedDict dari 10.000 entri,next(iter(d.items()))
sekitar 200 kali lebih cepat daripadaitems()[0]
.TETAPI jika Anda menyimpan daftar item () sekali dan kemudian menggunakan banyak daftar, itu bisa lebih cepat. Atau jika Anda berulang kali {membuat item () iterator dan melangkah melaluinya ke posisi yang Anda inginkan}, itu bisa lebih lambat.
sumber
OrderedDict
s tidak memilikiiteritems()
metode, sehingga Anda akan perlu melakukan hal berikut untuk mendapatkan item pertama:next(iter(d.items()))
.d.items()
sepertinya tidak menjadi iterator, jadi iter di depan tidak akan membantu? Itu masih akan mengembalikan daftar lengkap :(odict_iterator
dan dikonfirmasi kepada saya di IRC #python bahwa ini tidak membuat salinan daftar.Secara dramatis lebih efisien menggunakan IndexedOrderedDict dari
indexed
paket.Mengikuti komentar Niklas, saya telah melakukan benchmark pada OrderedDict dan IndexedOrderedDict dengan 1000 entri.
IndexedOrderedDict adalah ~ 100 kali lebih cepat dalam elemen pengindeksan pada posisi tertentu dalam kasus khusus ini.
sumber
indexed.py
alih-alihindexed
.Wiki komunitas ini berupaya mengumpulkan jawaban yang ada.
Python 2.7
Dalam python 2,
keys()
,values()
, danitems()
fungsi dariOrderedDict
daftar kembali. Menggunakanvalues
sebagai contoh, cara paling sederhana adalahUntuk koleksi besar di mana Anda hanya peduli pada satu indeks, Anda dapat menghindari membuat daftar lengkap menggunakan versi generator
iterkeys
,,itervalues
daniteritems
:The indexed.py menyediakan paket
IndexedOrderedDict
, yang dirancang untuk kasus penggunaan ini dan akan menjadi pilihan tercepat.Menggunakan itervalues bisa menjadi jauh lebih cepat untuk kamus besar dengan akses acak:
Python 3.6
Python 3 memiliki dua opsi dasar yang sama (list vs generator), tetapi metode dict mengembalikan generator secara default.
Metode daftar:
Metode generator:
Kamus Python 3 adalah urutan besarnya lebih cepat dari python 2 dan memiliki speedup serupa untuk menggunakan generator.
sumber
Ini adalah era baru dan dengan kamus Python 3.6.1 sekarang mempertahankan pesanan mereka. Semantik ini tidak eksplisit karena itu akan membutuhkan persetujuan BDFL. Tapi Raymond Hettinger adalah yang terbaik berikutnya (dan lebih lucu) dan dia membuat kasus yang cukup kuat bahwa kamus akan dipesan untuk waktu yang sangat lama.
Jadi sekarang mudah untuk membuat irisan kamus:
Catatan: Pelestarian urutan penyisipan diktonari sekarang resmi di Python 3.7 .
sumber
untuk OrderedDict () Anda dapat mengakses elemen dengan mengindeks dengan mendapatkan tupel pasangan (kunci, nilai) sebagai berikut atau menggunakan '.values ()'
sumber