我有一个从数据库中两个字段读取的值字典:字符串字段和数字字段。字符串字段是唯一的,因此它是字典的关键字。
我可以按关键字排序,但如何根据值排序?
注意:我在这里读过堆栈溢出问题。如何根据字典的值对字典列表进行排序?并且可能会更改我的代码,使其具有字典列表,但由于我确实不需要字典列表,我想知道是否有更简单的解决方案来按升序或降序排序。
我有一个从数据库中两个字段读取的值字典:字符串字段和数字字段。字符串字段是唯一的,因此它是字典的关键字。
我可以按关键字排序,但如何根据值排序?
注意:我在这里读过堆栈溢出问题。如何根据字典的值对字典列表进行排序?并且可能会更改我的代码,使其具有字典列表,但由于我确实不需要字典列表,我想知道是否有更简单的解决方案来按升序或降序排序。
当前回答
如果您的值是整数,并且使用Python 2.7或更高版本,则可以使用collections.Counter而不是dict。most_common方法将为您提供按值排序的所有项。
其他回答
使用Python 3.2:
x = {"b":4, "a":3, "c":1}
for i in sorted(x.values()):
print(list(x.keys())[list(x.values()).index(i)])
当然,请记住,您需要使用OrderedDict,因为常规Python字典不能保持原始顺序。
from collections import OrderedDict
a = OrderedDict(sorted(originalDict.items(), key=lambda x: x[1]))
如果您没有Python 2.7或更高版本,最好的方法就是迭代生成器函数中的值。(这里有2.4和2.6的OrderedDict,但是
a) 我不知道它有多好
and
b) 当然,你必须下载并安装它。如果您没有管理权限,那么恐怕该选项无效。)
def gen(originalDict):
for x, y in sorted(zip(originalDict.keys(), originalDict.values()), key=lambda z: z[1]):
yield (x, y)
#Yields as a tuple with (key, value). You can iterate with conditional clauses to get what you want.
for bleh, meh in gen(myDict):
if bleh == "foo":
print(myDict[bleh])
您还可以打印出每个值
for bleh, meh in gen(myDict):
print(bleh, meh)
如果不使用Python 3.0或更高版本,请记住在打印后删除括号
此方法不使用lambda,在Python 3.6上运行良好:
# sort dictionary by value
d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'}
def getkeybyvalue(d,i):
for k, v in d.items():
if v == i:
return (k)
sortvaluelist = sorted(d.values())
# In >> Python 3.6+ << the INSERTION-ORDER of a dict is preserved. That is,
# when creating a NEW dictionary and filling it 'in sorted order',
# that order will be maintained.
sortresult ={}
for i1 in sortvaluelist:
key = getkeybyvalue(d,i1)
sortresult[key] = i1
print ('=====sort by value=====')
print (sortresult)
print ('=======================')
简单如:sorted(dict1,key=dict1.get)
嗯,实际上可以进行“按字典值排序”。最近,我不得不在代码高尔夫(堆栈溢出问题代码高尔夫:单词频率表)中这样做。简言之,问题是这样的:给定一个文本,计算每个单词遇到的频率,并显示一个按频率递减排序的顶级单词列表。
如果您构建一个字典,将单词作为关键字,将每个单词的出现次数作为值,则此处简化为:
from collections import defaultdict
d = defaultdict(int)
for w in text.split():
d[w] += 1
然后,您可以得到一个单词列表,按使用频率排序,排序(d,key=d.get)-排序将使用单词出现的次数作为排序关键字,在字典关键字上迭代。
for w in sorted(d, key=d.get, reverse=True):
print(w, d[w])
我写这篇详细的解释是为了说明人们通常所说的“我可以很容易地按关键字对字典进行排序,但我如何按值排序”——我认为最初的文章正试图解决这一问题。解决方案是根据这些值列出一些键,如上所示。
从Python 3.6开始,dict对象现在按插入顺序排序。这是Python 3.7规范中的正式版本。
>>> words = {"python": 2, "blah": 4, "alice": 3}
>>> dict(sorted(words.items(), key=lambda x: x[1]))
{'python': 2, 'alice': 3, 'blah': 4}
在此之前,您必须使用OrderedDict。
Python 3.7文档说明:
在3.7版中更改:字典顺序保证插入顺序该行为是CPython在3.6中的实现细节。