{2:3, 1:89, 4:5, 3:0}转到{1:89, 2:3, 3:0, 4:5}的一种好方法是什么?
我检查了一些帖子,但它们都使用返回元组的“ sorted”运算符。

评论

字典本质上是未排序的。显示字典是另一回事。无论如何,您真正需要对其进行排序的是什么?

字典未排序。他们只是a。如果您想遍历所有元素,则必须像使用“针对for sorted(d.keys())中的键”那样使用sorted进行操作,假设d是字典的名称

@KarlKnechtel-我的用例是,我有一个具有原始菜单的CLI应用程序,并且菜单选项在字典中作为键。我想按字母顺序显示键,以确保用户的理智。

python中字典的可能重复项,与我在开始时设置的顺序相同

请注意,字典现在按插入顺序(python 3.6+)进行排序。下面的一些答案指出了这一点。

#1 楼

标准Python字典是无序的。即使对(键,值)对进行了排序,也无法以保留顺序的方式将它们存储在dict中。

最简单的方法是使用OrderedDict,即记住元素的插入顺序:

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)])


不要管打印od的方式;它会按预期工作:

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


Python 3

对于Python 3用户,需要使用.items()而不是.iteritems(): br />
In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5


评论


我用了它,它起作用了,我猜想它有更多的代码和冗余但可以完成工作,#无序字典d = {2:3,1:89,4:5,3:0} orderedDict = {}用于排序键(d.iterkeys()):orderedDict [key] = d [key]

– Antony
2012年1月25日上午11:20

@achrysochoou:如果成功的话,那一定是靠运气。如您所知,常规字典没有排序的概念,无论您分配的关键字是排序的还是随机分配的。

–里卡多·卡德尼斯(RicardoCárdenes)
2012年1月25日上午11:25

对于python 3.7+:sorted_dict = dict(sorted(unsorted_dict.items()))

–aksh1618
18年7月15日在14:52

python 3.7+不需要orderedDict,因为它现在默认情况下订购:-)

–空中
19年1月25日在18:09

从python 3.7.4手册开始:“在字典上执行list(d)将按插入顺序返回字典中使用的所有键的列表”。因此,插入顺序是可以保留的,我们可以依靠。

– Mostafa Hadian
19年7月16日在17:40

#2 楼

字典本身没有这样的排序项目,如果您想按某种顺序打印它们,请看以下示例:

在Python 2.4及更高版本中:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])


给出:

alan: 2
bob: 1
carl: 40
danny: 3


(2.4以下的Python :)

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])


源:http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/

评论


您也可以在Python 2.4+中使用OrderedDict,如NPE的答案

– radtek
15年1月29日在22:09

如果您使用的是items(),则可以像对键,sorted(mydict.items())中的值那样进行操作

–beep_check
2月4日下午2:07

字典本身没有这样的排序项目->不再正确!

– minexew
4月6日下午6:46

你怎么能解释?

–詹姆斯
4月6日9:31

#3 楼

来自Python的collections库文档:

>>> 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)])


评论


太棒了!伙计们,如果您想颠倒顺序(升序到降序),则只需添加reverse = True例如OrderedDict(sorted(d.items(),reverse = True,key = lambda t:t [0]))

–本斯卡比亚
16年8月28日在20:03

在PyCharm中,无论我使用什么词典,我总是收到以下警告:意外类型:(List [str])可能类型:(映射)(Iterable [Tuple [Any,Any]])

–Euler_Salter
18年7月24日在10:00

#4 楼

对于CPython / PyPy 3.6以及任何Python 3.7或更高版本,可以轻松实现:

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}


评论


写同一件事的另一种方法是使用理解:{key:d [key] for sorted(d.keys())中的键}

– flow2k
19年11月27日在22:57



#5 楼

有许多Python模块提供字典实现,这些实现自动按排序顺序维护键。考虑sortedcontainers模块,它是纯Python和快速C实现。在性能上,还可以与其他比较好的基准进行比较。 >
>>> 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)]


SortedDict类型还支持索引位置查找和删除,这是内置dict类型无法实现的。

>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])


#6 楼

只需:

d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())

for k,v in sd:
    print k, v


输出:

1 89
2 3
3 0
4 5


评论


sd是一个元组列表,而不是字典。 (尽管仍然有用。)

– nischi
16-11-24在9:53

我相信您的打印声明需要()。列印(k,v)

– DenVog
8月14日19:56

#7 楼

正如其他人所提到的,词典本质上是无序的。但是,如果问题仅在于按顺序显示字典,则可以在字典子类中重写__str__方法,并使用此字典类而不是内置的dict。例如,

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}


请注意,这不会改变密钥的存储方式,迭代时它们返回的顺序等,以及它们的显示方式使用print或在python控制台上。

#8 楼

找到了另一种方法:

import json
print json.dumps(d, sort_keys = True)


upd:
1。这也会对嵌套对象进行排序(感谢@DanielF)。
2。 python字典是无序的,因此可以打印或仅分配给str。

评论


但这还会对嵌套对象的键进行排序,这可能是不需要的。

–丹尼尔F
15年7月17日在21:08

请注意,这仅对字典排序,而不对列表进行排序,例如dict.keys()不会排序,因为它是一个列表。

–安德鲁(Andrew)
17年8月18日在20:08



#9 楼

在Python 3中。

>>> D1 = {2:3, 1:89, 4:5, 3:0}
>>> for key in sorted(D1):
    print (key, D1[key])


给予

1 89
2 3
3 0
4 5


#10 楼

Python字典在Python 3.6之前是无序的。在Python 3.6的CPython实现中,字典保留插入顺序。
从Python 3.7开始,它将成为一种语言功能。

在Python 3.6的更新日志中(https://docs.python。 org / 3.6 / whatsnew / 3.6.html#whatsnew36-compactdict):


此新实现的顺序保留方面被认为是
实现的详细信息,不应被依赖(将来可能会更改,但是希望在更改
语言规范以强制要求保留订单的语义之前,先在几个发行版中使用该语言的新dict
实现,所有当前的
和将来的Python实现;这还有助于保持
与旧版本的语言的向后兼容性,在该版本中,
随机迭代顺序仍然有效,例如Python 3.5)。


在Python 3.7文档中(https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries):


执行列表( d)根据命令ionary按插入顺序返回字典中所有已使用键的列表
(如果要对其进行排序,只需使用
sorted(d)即可)。


因此,与以前的版本不同,您可以在Python 3.6 / 3.7之后对字典进行排序。如果要对嵌套的字典(包括内部的子字典)进行排序,可以执行以下操作:

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

#11 楼

在这里,我找到了一些最简单的解决方案,可以使用pprint
例如按键对python字典进行排序。

>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99} 
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}


,但是在使用pprint时,它将返回排序后的字典

>>> import pprint 
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}


#12 楼

有一种简单的方法可以对字典进行排序。

根据您的问题,

解决方案是:

c={2:3, 1:89, 4:5, 3:0}
y=sorted(c.items())
print y


(其中c是您的字典的名称。)

该程序提供以下输出:

[(1, 89), (2, 3), (3, 0), (4, 5)]


如您所愿。

另一个例子是:

d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41}
x=sorted(d.keys())
print x


给出输出:['Albert', 'Bill', 'John', 'Lucy', 'Peter']

y=sorted(d.values())
print y



给出输出:[18, 24, 32, 36, 41]

z=sorted(d.items())
print z


给出输出:
,值和项目,您可以按照自己的需要进行打印。希望这会有所帮助!

#13 楼

一种简单的方法:

d = {2:3, 1:89, 4:5, 3:0}

s = {k : d[k] for k in sorted(d)}

s


Out[1]: {1: 89, 2: 3, 3: 0, 4: 5} 


评论


仅适用于python 3.7+,其中dict是OrderedDict。

–kwarnke
12月7日,11:04

#14 楼

会完全生成您想要的:

 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}


但这不是正确的方法,因为,它可以显示不同字典的不同行为,而我拥有最近学到的。因此,蒂姆(Tim)在我在这里分享的“我的查询”的响应中提出了一种完美的方法。

from collections import OrderedDict
sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0]))


评论


“显示具有不同词典的独特行为”是什么意思?排序无法处理的“独特行为”是什么?

–在这里
19年11月10日在20:26

#15 楼

您可以根据问题按关键字对当前词典进行排序来创建新词典。

这是您的词典

d = {2:3, 1:89, 4:5, 3:0}


创建新词典通过使用lambda函数对该字典d排序来字典d1

d1 = dict(sorted(d.items(), key = lambda x:x[0]))


d1应该为{1:89,2:3,3:0,4:5},基于d。
中的键

#16 楼

我认为最简单的方法是按键对字典进行排序,然后将排序后的键:值对保存到新字典中。

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]


使其更清晰:

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


#17 楼

Python字典是无序的。通常,这不是问题,因为最常见的用例是进行查找。

执行所需操作的最简单方法是创建collections.OrderedDict,以按顺序插入元素。正如上面其他人所建议的那样,迭代是最简单的方法是迭代排序的键。示例-

打印按键排序的值:

ordered_dict = collections.OrderedDict([(k, d[k]) for k in sorted(d.keys())])


获取按键排序的值的列表:

评论


对于k,sorted(d.items())中的value更好:避免在循环中再次通过键访问dict

–Jean-FrançoisFabre♦
18年4月27日在19:38

#18 楼

此函数将按其键对所有字典进行递归排序。也就是说,如果字典中的任何值也是字典,那么它也将通过其键进行排序。如果您在CPython 3.6或更高版本上运行,则可以简单地更改为使用dict而不是OrderedDict

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)


#19 楼

我提出单行字典排序。

>> 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]


希望这会有所帮助。

#20 楼

伙计们,您正在使事情变得复杂...这真的很简单

from pprint import pprint
Dict={'B':1,'A':2,'C':3}
pprint(Dict)


输出为:

{'A':2,'B':1,'C':3}


评论


因为我不知道pprint排序字典来显示它们而被提议,但是OP确实询问了从未排序dict到排序dict的“去向”,即OP似乎想要一些保留在内存中的东西,也许对于某些需要排序键的算法

–莱普顿船长
16 Dec 8'在16:13



此方法将不允许链式分配,因为pprint不返回任何值。 >>> adict = {'B':1,'A':2,'C':3} >>> ppdict = pprint(adict){'A':2,'B':1,'C': 3} >>> ppdict.type()追溯(最近一次调用):中第1行的文件“ ” AttributeError:'NoneType'对象没有属性'type'

–user4322543
16 Dec 8'在19:02



#21 楼

from operator import itemgetter
# if you would like to play with multiple dictionaries then here you go:
# Three dictionaries that are composed of first name and last name.
user = [
    {'fname': 'Mo', 'lname': 'Mahjoub'},
    {'fname': 'Abdo', 'lname': 'Al-hebashi'},
    {'fname': 'Ali', 'lname': 'Muhammad'}
]
#  This loop will sort by the first and the last names.
# notice that in a dictionary order doesn't matter. So it could put the first name first or the last name first. 
for k in sorted (user, key=itemgetter ('fname', 'lname')):
    print (k)

# This one will sort by the first name only.
for x in sorted (user, key=itemgetter ('fname')):
    print (x)


#22 楼

最简单的解决方案是,您应该获取dict键的列表,并将其排序,然后遍历dict。例如

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]


以下将是输出(降序)

e 30
b 13
d 4
c 2
a 1


#23 楼

dictionary = {1:[2],2:[],5:[4,5],4:[5],3:[1]}

temp=sorted(dictionary)
sorted_dict = dict([(k,dictionary[k]) for i,k in enumerate(temp)])

sorted_dict:
         {1: [2], 2: [], 3: [1], 4: [5], 5: [4, 5]}


#24 楼

2.7中这两种方法的时序比较显示它们实际上是相同的:

>>> setup_string = "a = sorted(dict({2:3, 1:89, 4:5, 3:0}).items())"
>>> timeit.timeit(stmt="[(k, val) for k, val in a]", setup=setup_string, number=10000)
0.003599141953657181

>>> setup_string = "from collections import OrderedDict\n"
>>> setup_string += "a = OrderedDict({1:89, 2:3, 3:0, 4:5})\n"
>>> setup_string += "b = a.items()"
>>> timeit.timeit(stmt="[(k, val) for k, val in b]", setup=setup_string, number=10000)
0.003581275490432745 


#25 楼

或使用pandas
演示:
>>> d={'B':1,'A':2,'C':3}
>>> df=pd.DataFrame(d,index=[0]).sort_index(axis=1)
   A  B  C
0  2  1  3
>>> df.to_dict('int')[0]
{'A': 2, 'B': 1, 'C': 3}
>>> 

请参阅:

此文档
整只熊猫的文档


#26 楼

对于问题的表达方式,这里最多的答案是正确回答。

但是,考虑到几十年来的计算机科学,这些事情应该如何真正完成,总的猜测是,实际上只有一个答案(来自GrantJ用户)建议使用排序的关联容器(sortedcontainer),该容器根据插入点处的键对元素进行排序。

这样可以避免每次调用sort(...)都会对性能造成重大影响(至少O(N*log(N)),其中N是元素数量(从逻辑上讲,这适用于此处建议使用sort(...)的所有此类解决方案)。考虑到对于所有此类解决方案,每次在需要通过添加/删除元素对其进行修改后对collet进行排序时都需要调用sort(...)

#27 楼

l = dict.keys()
l2 = l
l2.append(0)
l3 = []
for repeater in range(0, len(l)):
    smallnum = float("inf")
    for listitem in l2:
        if listitem < smallnum:
            smallnum = listitem
    l2.remove(smallnum)
    l3.append(smallnum)
l3.remove(0)
l = l3

for listitem in l:
    print(listitem)


评论


还有其他14个答案。您能否解释一下您的代码,为什么它可能比其他解决方案更好?

– FelixSFD
16-10-25在15:53

Downvoted-非常简短的代码,具有简短的无意义的变量名l,l2,l3。似乎是尝试使用一种不了解python标准函数的间接且低效的算法,并且在原始帖子中的小示例上进行测试时无论如何都不起作用。

–莱普顿船长
16年8月8日在16:17

#28 楼

我的建议是这样,因为它允许您在添加项目时对字典进行排序或对字典进行排序,并且将来可能需要添加项目:有第二个数据结构,一个列表,以及您的键列表。 bisect软件包具有insort函数,该函数允许插入排序列表中,或者在完全填充字典后对列表进行排序。现在,当您遍历字典时,您可以遍历列表以按顺序访问每个键,而不必担心dict结构的表示(不是用于排序的)。