我想基于子键key3的值按降序对该字典d进行排序。见下文:
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
'124': { 'key1': 6, 'key2': 56, 'key3': 6 },
'125': { 'key1': 7, 'key2': 44, 'key3': 9 },
}
所以最后的字典看起来像这样。
d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
'124': { 'key1': 6, 'key2': 56, 'key3': 6 },
'123': { 'key1': 3, 'key2': 11, 'key3': 3 },
}
我的方法是从d形成另一个字典e,其键值为key3然后使用reverse(sorted(e))但由于key3的值可以相同,所以字典e丢失了一些键和它们的值。有意义吗?
我怎么能做到这一点?这不是经过测试的代码。我只是想了解逻辑。
答案 0 :(得分:50)
Dictionaries do not have any inherent order。或者说,它们的固有顺序是“任意但不随意”,所以它对你没有任何好处。
换句话说,您的d
和e
将完全等同于词典。
您可以在此处使用OrderedDict
:
from collections import OrderedDict
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
'124': { 'key1': 6, 'key2': 56, 'key3': 6 },
'125': { 'key1': 7, 'key2': 44, 'key3': 9 },
}
d_ascending = OrderedDict(sorted(d.items(), key=lambda kv: kv[1]['key3']))
d_descending = OrderedDict(sorted(d.items(),
key=lambda kv: kv[1]['key3'], reverse=True))
原始d
有一些任意顺序。 d_ascending
具有您在原始d
中思考的顺序,但却没有。 d_ascending
具有您e
所需的订单。
如果你真的不需要使用e
作为字典,你只是希望能够以特定的顺序迭代d
的元素,你可以简化这个:
for key, value in sorted(d.items(), key=lambda kv: kv[1]['key3'], reverse=True):
do_something_with(key, value)
如果要在任何更改中按排序顺序维护字典,而不是OrderedDict
,则需要某种排序字典。您可以在PyPI上找到许多可用选项,一些在树顶部实现,另一些在OrderedDict
之上,根据需要重新排序等等。
答案 1 :(得分:29)
排序字典的简短示例是降序
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
答案 2 :(得分:5)
您可以使用以下代码按降序排序并存储到字典中:
listname = []
for key, value in sorted(dictionaryName.iteritems(), key=lambda (k,v): (v,k),reverse=True):
diction= {"value":value, "key":key}
listname.append(diction)
答案 3 :(得分:4)
答案 4 :(得分:4)
您可以使用运算符按降序对字典进行排序。
import operator
d = {"a":1, "b":2, "c":3}
cd = sorted(d.items(),key=operator.itemgetter(1),reverse=True)
排序后的字典看起来像
cd = {"c":3, "b":2, "a":1}
operator.itemgetter(1)在此处获取索引1处的键值。
答案 5 :(得分:2)
列表
dict = {'Neetu':22,'Shiny':21,'Poonam':23}
print sorted(dict.items())
sv = sorted(dict.values())
print sv
词典
d = []
l = len(sv)
while l != 0 :
d.append(sv[l - 1])
l = l - 1
print d`
答案 6 :(得分:1)
排序字典' in_dict'按递减顺序的值
sorted_dict = {r: in_dict[r] for r in sorted(in_dict, key=in_dict.get, reverse=True)}
上面的例子
sorted_d = {r: d[r] for r in sorted(d, key=d.get('key3'), reverse=True)}
答案 7 :(得分:0)
只要有一个字典,其中的值是整数,与字典相比,Counter数据结构通常是表示数据的更好选择。
如果您已经有字典,则可以通过以下方式轻松组成计数器:
c = Counter(d['123'])
以您的数据为例。
通过most_common
功能可以轻松访问柜台中物品的降序
有关Counter数据结构的更完整的介绍位于https://docs.python.org/2/library/collections.html
答案 8 :(得分:0)
您可以使用 dictRysan 库。我认为这将解决您的任务。
import dictRysan as ry
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
'124': { 'key1': 6, 'key2': 56, 'key3': 6 },
'125': { 'key1': 7, 'key2': 44, 'key3': 9 },
}
changed_d=ry.nested_2L_value_sort(d,"key3",True)
print(changed_d)
答案 9 :(得分:0)
f= {273: 6, 272: 2, 2: 1, 3083: 1, 281: 1, 2490: 5, 366: 5, 1945: 4, 869: 1, 1398: 1, 1920: 5, 3061: 2, 862: 1}
sorted_d = dict( sorted(f.items(), key=operator.itemgetter(1),reverse=True))
print('Dictionary in descending order by value : ',sorted_d)