Nul*_*ion 39 python dictionary
我想基于子键key3的值按降序对该字典d进行排序.见下文:
d = { '123': { 'key1': 3, 'key2': 11, 'key3': 3 },
'124': { 'key1': 6, 'key2': 56, 'key3': 6 },
'125': { 'key1': 7, 'key2': 44, 'key3': 9 },
}
Run Code Online (Sandbox Code Playgroud)
所以最后的字典看起来像这样.
d = { '125': { 'key1': 7, 'key2': 44, 'key3': 9 },
'124': { 'key1': 6, 'key2': 56, 'key3': 6 },
'123': { 'key1': 3, 'key2': 11, 'key3': 3 },
}
Run Code Online (Sandbox Code Playgroud)
我的方法是从d形成另一个字典e,其键是key3的值,然后使用reverse(sorted(e))但由于key3的值可以相同,所以字典e丢失了一些键及其值.说得通?
我怎么能做到这一点?这不是经过测试的代码.我只是想了解逻辑.
aba*_*ert 55
字典没有任何固有的顺序.或者说,它们的固有顺序是"任意但不随意",所以它对你没有任何好处.
用不同的术语来说,你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))
Run Code Online (Sandbox Code Playgroud)
原来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)
Run Code Online (Sandbox Code Playgroud)
如果要在任何更改中按排序顺序维护字典,而不是a OrderedDict,则需要某种排序字典.您可以在PyPI上找到许多可用选项,一些在树顶上实现,另一些在OrderedDict必要时重新排序,等等.
Sha*_*fiq 36
排序字典的一个简短示例是降序
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])
Run Code Online (Sandbox Code Playgroud)
以下是输出
e 30
b 13
d 4
c 2
a 1
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以使用运算符按照降序对字典进行排序。
import operator
d = {"a":1, "b":2, "c":3}
cd = sorted(d.items(),key=operator.itemgetter(1),reverse=True)
Run Code Online (Sandbox Code Playgroud)
排序字典看起来像
cd = {"c":3, "b":2, "a":1}
Run Code Online (Sandbox Code Playgroud)
在这里,operator.itemgetter(1)接受位于索引1处的键的值。
根据定义,Python dicts 没有排序。您不能对其进行排序,也不能通过插入元素的方式来控制其元素的顺序。您可能想查看 collections.OrderDict,它甚至附带了一个几乎完全符合您要执行的操作的小教程:http : //docs.python.org/2/library/collections.html#ordereddict-examples-和-食谱
您可以使用以下代码按降序排序并存储到字典中:
listname = []
for key, value in sorted(dictionaryName.iteritems(), key=lambda (k,v): (v,k),reverse=True):
diction= {"value":value, "key":key}
listname.append(diction)
Run Code Online (Sandbox Code Playgroud)