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
我知道字典是随机的且不可排序,但也许有一种方法可以将键和值放入列表中?我面临的主要挑战是获取按值(从大到小)排序的键和值,然后将值更改为排序列表中相应的排名。
I have 2 dictionaries, dict1
and dict2
which contain the same keys, but different values for the keys. What I want to do is for each dictionary, sort the values from largest to smallest, and then give each value a rank 1-N, 1 being the largest value. From here, I want to get the difference of the ranks for the values in each dictionary for the same key. For example:
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
I know dictionaries are meant to be random and not sortable, but maybe there is a method to put the keys and values into a list? The main challenges I am facing are getting the keys and values sorted by value (largest to smallest) and then changing the value to its respective rank in the sorted list.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
对于小字典来说,一个简单的解决方案是
针对较大字典的更高效、可读性较差的版本:
A simple solution for small dicts is
A more efficient, less readable version for larger dicts:
您可能对 collections.OrderedDict 感兴趣,
这是一个示例,我最初的想法您是否还在寻找带有按值排序的键的字典,例如 od1 和 od2 。
如果您不需要它们,那么 Sven 解决方案可能会更快。
编辑:老实说没那么快...(sven.py是他的第二个更高效的版本):
如果有人想发布格式化的更大的字典,我也会测试它们。
You may be interested in collections.OrderedDict
Here's a sample, my initial thougth is you were also looking for dictionaries with keys ordered by values, things that
od1
andod2
are.If you don't need them then Sven solution is probably faster.
edit: not that faster honestly... (sven.py is his second, more efficient version):
If someone wants to post formatted bigger dicts I'll test them too.
你使用什么版本的Python?如果是 2.7,则使用 OrderedDict。
根据 Python 2.7 docs:
如果您使用的是 Python 2.4-2.6,您仍然可以使用OrderedDict 通过从 pypi 此处 安装它或者如果您有 setuptools,运行
What version of python are you using? If 2.7, use OrderedDict.
Per the Python 2.7 docs:
If you're using Python 2.4-2.6 you can still use OrderedDict by installing it from pypi here or if you have setuptools, run
字典不是解决这个问题的正确数据结构。您应该尽快转换为排序列表,并仅生成字典作为最终结果。以下示例解决方案尽可能使用迭代器和生成器表达式,以避免在此过程中创建太多(可能很大)的帮助器列表:
请注意,此解决方案假设两个字典包含完全相同的键。
A dictionary is not the right data structure to solve this problem. You should convert to sorted lists as soon as possible and produce the dictionary only as the final result. The following sample solution uses iterators and generator expressions where possible, to avoid creating too many (potentially large) helper lists along the way:
Please note that this solution assumes that both dicts contain exactly the same keys.