python字典值排序
我有2个字典, dict1
和dict2
,它们包含相同的密钥,但密钥的值不同。 我想要做的是为每个字典,将值从大到小排序,然后给每个值排序1-N,1是最大的值。 从这里,我想获得每个字典中相同键的值的等级差异。 例如:
dict1 = {a:0.6, b:0.3, c:0.9, d:1.2, e:0.2}
dict2 = {a:1.4, b:7.7, c:9.0, d:2.5, e:2.0}
# sorting by values would look like this:
dict1 = {d:1.2, c:0.9, a:0.6, b:0.3, e:0.2}
dict2 = {c:9.0, b:7.7, d:2.5, e:2.0, a:1.4}
#ranking the values would produce this:
dict1 = {d:1, c:2, a:3, b:4, e:5}
dict2 = {c:1, b:2, d:3, e:4, a:5}
#computing the difference between ranks would be something like this:
diffs = {}
for x in dict1.keys():
diffs[x] = (dict1[x] - dict2[x])
#diffs would look like this:
diffs[a] = -2
diffs[b] = 2
diffs[c] = 1
diffs[d] = -2
diffs[e] = 1
我知道字典是随机的,不可排序,但也许有一种方法可以将键和值放入列表中? 我面临的主要挑战是获取按值排序的键和值(从最大到最小),然后将值更改为排序列表中相应的排名。
一个简单的小解决方案是
dict1 = {"a":0.6, "b":0.3, "c":0.9, "d":1.2, "e":0.2}
dict2 = {"a":1.4, "b":7.7, "c":9.0, "d":2.5, "e":2.0}
k1 = sorted(dict1, key=dict1.get)
k2 = sorted(dict2, key=dict2.get)
diffs = dict((k, k2.index(k) - k1.index(k)) for k in dict1)
对于较大的字典,更高效,可读性更低:
ranks1 = dict(map(reversed, enumerate(sorted(dict1, key=dict1.get))))
ranks2 = dict(map(reversed, enumerate(sorted(dict2, key=dict2.get))))
diffs = dict((k, ranks2[k] - ranks1[k]) for k in dict1)
您可能对collections.OrderedDict感兴趣
这里有一个例子,我最初的想法是你也在寻找字典中按值排序的字典, od1
和od2
是这样的东西。
d1 = {"a":0.6, "b":0.3, "c":0.9, "d":1.2, "e":0.2}
d2 = {"a":1.4, "b":7.7, "c":9.0, "d":2.5, "e":2.0}
od1 = OrderedDict(sorted(d1.items(), key=lambda t: t[1]))
od2 = OrderedDict(sorted(d2.items(), key=lambda t: t[1]))
k1 = od1.keys()
k2 = od2.keys()
diff = dict((k, n - k2.index(k)) for n, k in enumerate(k1))
如果你不需要它们,那么Sven解决方案可能会更快。
编辑 :老实说不是更快...(sven.py是他的第二个更有效的版本):
$ cat /tmp/mine.py | time python -m timeit
10000000 loops, best of 3: 0.0842 usec per loop
real 0m 3.69s
user 0m 3.38s
sys 0m 0.03s
$ cat /tmp/sven.py | time python -m timeit
10000000 loops, best of 3: 0.085 usec per loop
real 0m 3.86s
user 0m 3.42s
sys 0m 0.03s
如果有人想发布格式化更大的字典,我也会测试它们。
你使用的是什么版本的Python? 如果2.7,使用OrderedDict。
根据Python 2.7文档:
OrderedDict(sorted(d.items(), key=d.get))
如果你使用的是Python 2.4-2.6,你仍然可以通过在这里安装pypi来使用OrderedDict,或者如果你有setuptools,运行
easy_install ordereddict
链接地址: http://www.djcxy.com/p/18115.html