Apa yang akan menjadi cara yang bagus untuk pergi dari{2:3, 1:89, 4:5, 3:0}
untuk{1:89, 2:3, 3:0, 4:5}
?
Aku memeriksa beberapa posting tapi mereka semua gunakan "diurutkan" operator yang mengembalikan tupel.
Standar Python kamus unordered. Bahkan jika anda diurutkan (key,value) pasangan, anda tidak't dapat menyimpannya dalam dict
dalam suatu cara yang akan melestarikan memesan.
Cara termudah adalah dengan menggunakan OrderedDict
, yang mengingat urutan di mana unsur-unsur yang telah dimasukkan:
In [1]: import collections
In [2]: d = {2:3, 1:89, 4:5, 3:0}
In [3]: od = collections.OrderedDict(sorted(d.items()))
In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])
Sudahlah jalan od
dicetak; it'll bekerja seperti yang diharapkan:
In [11]: od[1]
Out[11]: 89
In [12]: od[3]
Out[12]: 0
In [13]: for k, v in od.iteritems(): print k, v
....:
1 89
2 3
3 0
4 5
Untuk Python 3 pengguna, salah satu kebutuhan untuk menggunakan .item()
bukan .iteritems()
:
In [13]: for k, v in od.items(): print(k, v)
....:
1 89
2 3
3 0
4 5
Kamus sendiri tidak memiliki barang pesanan karena itu, jika anda ingin mencetaknya dll untuk beberapa order, berikut adalah beberapa contoh:
Di Python 2.4 atas:
mydict = {'carl':40,
'alan':2,
'bob':1,
'danny':3}
for key in sorted(mydict):
print "%s: %s" % (key, mydict[key])
memberikan:
alan: 2
bob: 1
carl: 40
danny: 3
(Python 2.4 di bawah ini:)
keylist = mydict.keys()
keylist.sort()
for key in keylist:
print "%s: %s" % (key, mydict[key])
Sumber: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
Dari Python's koleksi
perpustakaan documentation:
>>> from collections import OrderedDict
>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
Ada sejumlah modul-modul Python yang menyediakan kamus implementasi yang secara otomatis mempertahankan tombol dalam urutan diurutkan. Mempertimbangkan sortedcontainers modul yang murni Python dan cepat-sebagai-C implementasi. Ada juga perbandingan kinerja dengan pilihan populer lain mengacu kepada satu sama lain.
Menggunakan memerintahkan dict yang tidak memadai solusi jika anda perlu untuk terus-menerus menambah dan menghapus pasangan kunci/nilai sementara juga iterasi.
>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]
Yang SortedDict jenis ini juga mendukung diindeks lokasi pencarian dan penghapusan yang isn't mungkin dengan built-in dict jenis.
>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])
Seperti orang lain telah disebutkan, kamus inheren unordered. Namun, jika masalah ini hanya menampilkan kamus dalam fashion, anda dapat mengganti __str__
metode dalam kamus subclass, dan menggunakan kamus ini kelas daripada builtin dict
. Misalnya.
class SortedDisplayDict(dict):
def __str__(self):
return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"
>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}
Catatan, ini perubahan apa-apa tentang bagaimana kunci disimpan, agar mereka akan datang kembali ketika anda iterate atas mereka dll, hanya bagaimana mereka're ditampilkan dengan mencetak
atau di konsol python.
Menemukan cara lain:
import json
print json.dumps(d, sort_keys = True)
upd:
Python dictionary adalah unordered sebelum Python 3.6. Di CPython implementasi Python 3.6, kamus menjaga penyisipan order. Dari Python 3.7, ini akan menjadi fitur bahasa.
Dalam changelog dari Python 3.6 (https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict):
rangka melestarikan aspek implementasi ini baru dianggap implementasi detail dan tidak boleh diandalkan (ini mungkin perubahan di masa depan, tapi itu diinginkan untuk memiliki ini baru dict implementasi di bahasa untuk beberapa rilis sebelum mengubah bahasa spec mandat rangka melestarikan semantik untuk semua saat ini dan masa depan Python implementasi; hal ini juga membantu melestarikan mundur kompatibilitas dengan versi bahasa mana random iterasi rangka masih berlaku, misalnya Python 3.5).
Dalam dokumen Python 3.7 (https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries):
Melakukan daftar(d) pada kamus kembali daftar semua tombol yang digunakan di kamus, di media order (jika anda ingin diurutkan, hanya menggunakan diurutkan(d) sebagai gantinya).
Jadi tidak seperti versi sebelumnya, anda dapat mengurutkan dict setelah Python 3.6/3.7. Jika anda ingin mengurutkan bersarang dict termasuk sub-dict dalam, yang dapat anda lakukan:
test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}
def dict_reorder(item):
return {k: sort_dict(v) if isinstance(v, dict) else v for k, v in sorted(item.items())}
reordered_dict = dict_reorder(test_dict)
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
Di sini saya menemukan beberapa solusi sederhana untuk mengurutkan python dict dengan kunci menggunakan pprint
.
misalnya.
>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99}
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}
tapi saat menggunakan pprint itu akan kembali diurutkan dict
>>> import pprint
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}
Ada cara mudah untuk mengurutkan sebuah kamus.
Sesuai dengan pertanyaan anda,
Solusinya adalah :
c={2:3, 1:89, 4:5, 3:0}
y=sorted(c.items())
print y
(Di mana c adalah nama dari kamus anda.)
Program ini memberikan output sebagai berikut:
[(1, 89), (2, 3), (3, 0), (4, 5)]
seperti yang u inginkan.
Contoh lain adalah:
d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41}
x=sorted(d.keys())
print x
Memberikan output:['Albert', 'Bill', 'John', 'Lucy', 'Peter']
y=sorted(d.values())
print y
Memberikan output:[18, 24, 32, 36, 41]
z=sorted(d.items())
print z
Memberikan output:
[('Albert', 32), ('Bill', 41), ('John', 36), ('Lucy', 24), ('Peter', 18)]
Oleh karena itu dengan mengubah menjadi kunci, nilai-nilai dan item , anda dapat mencetak seperti apa yang u inginkan.Harap ini membantu!
Akan menghasilkan apa yang anda inginkan:
D1 = {2:3, 1:89, 4:5, 3:0}
sort_dic = {}
for i in sorted(D1):
sort_dic.update({i:D1[i]})
print sort_dic
{1: 89, 2: 3, 3: 0, 4: 5}
Tapi ini bukan cara yang benar untuk melakukan hal ini, karena, Itu bisa menunjukkan perilaku yang berbeda dengan kamus yang berbeda, yang telah saya pelajari baru-baru ini. Oleh karena itu cara yang telah disarankan oleh Tim Di respon pertanyaan saya yang saya sharing di sini.
from collections import OrderedDict
sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0]))
Anda dapat membuat kamus dengan menyortir saat ini kamus dengan kunci sesuai pertanyaan anda.
Ini adalah kamus anda
d = {2:3, 1:89, 4:5, 3:0}
Membuat sebuah kamus baru d1 dengan menyortir d ini menggunakan fungsi lambda
d1 = dict(sorted(d.items(), key = lambda x:x[0]))
d1 harus {1: 89, 2: 3, 3: 0, 4: 5}, diurutkan berdasarkan kunci dalam d.
Saya pikir hal yang paling mudah adalah untuk mengurutkan dict dengan kunci dan menyimpan diurutkan kunci:nilai pasangan baru dict.
dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2}
dict2 = {} # create an empty dict to store the sorted values
for key in sorted(dict1.keys()):
if not key in dict2: # Depending on the goal, this line may not be neccessary
dict2[key] = dict1[key]
Untuk membuatnya lebih jelas:
dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2}
dict2 = {} # create an empty dict to store the sorted values
for key in sorted(dict1.keys()):
if not key in dict2: # Depending on the goal, this line may not be neccessary
value = dict1[key]
dict2[key] = value
Python dicts un-ordered. Biasanya, hal ini tidak menjadi masalah karena yang paling umum use case adalah untuk melakukan pencarian.
Cara paling mudah untuk melakukan apa yang anda inginkan akan membuat koleksi.OrderedDict
memasukkan elemen-elemen yang terurut.
ordered_dict = collections.OrderedDict([(k, d[k]) for k in sorted(d.keys())])
Jika anda perlu untuk melakukan iterasi, seperti orang-orang lain di atas telah menyarankan, cara paling sederhana akan iterate atas diurutkan kunci. Contoh-
Cetak nilai-nilai yang diurutkan berdasarkan kunci:
# create the dict
d = {k1:v1, k2:v2,...}
# iterate by keys in sorted order
for k in sorted(d.keys()):
value = d[k]
# do something with k, value like print
print k, value
Dapatkan daftar nilai diurutkan berdasarkan kunci:
values = [d[k] for k in sorted(d.keys())]
Aku datang dengan satu baris dict penyortiran.
>> a = {2:3, 1:89, 4:5, 3:0}
>> c = {i:a[i] for i in sorted(a.keys())}
>> print(c)
{1: 89, 2: 3, 3: 0, 4: 5}
[Finished in 0.4s]
Berharap ini akan membantu.
Fungsi ini akan mengurutkan kamus rekursif oleh kunci. Artinya, jika setiap nilai dalam kamus adalah sebuah kamus, itu juga akan diurutkan dengan kunci. Jika anda berjalan pada CPython 3.6 atau lebih besar, dari perubahan sederhana untuk menggunakan dict
daripada OrderedDict
dapat dibuat.
from collections import OrderedDict
def sort_dict(d):
items = [[k, v] for k, v in sorted(d.items(), key=lambda x: x[0])]
for item in items:
if isinstance(item[1], dict):
item[1] = sort_dict(item[1])
return OrderedDict(items)
#return dict(items)
Solusi yang paling sederhana adalah bahwa anda harus mendapatkan daftar dict kunci diurutkan dan kemudian iterate atas dict. Misalnya
a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30}
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True)
for r in a1_sorted_keys:
print r, a1[r]
Berikut ini akan menjadi output (desending order)
e 30
b 13
d 4
c 2
a 1