iCo*_*unk 0 python sorting dictionary
最初的数据是这样的:
dict = {<User: user2>: {'diff': 48, 'alike': 1}, <User: user3>: {'diff': 42, 'alike': 2}, <User: user4>: {'diff': 45, 'alike': 1}, <User: user5>: {'diff': 43, 'alike':
2}, <User: user6>: {'diff': 46, 'alike': 1}, <User: user7>: {'diff': 46, 'alike': 1}, <User: user8>: {'diff': 49, 'alike': 1}, <User: user9>: {'diff': 50, 'ali
ke': 0}, <User: user10>: {'diff': 46, 'alike': 1}, <User: user11>: {'diff': 37, 'alike': 3}, <User: user12>: {'diff': 50, 'alike': 0}, <User: user13>: {'diff':
50, 'alike': 0}, <User: user14>: {'diff': 50, 'alike': 0}, <User: user15>: {'diff': 50, 'alike': 0}, <User: user16>: {'diff': 50, 'alike': 0}, <User: user17>: {
'diff': 50, 'alike': 0}, <User: user18>: {'diff': 50, 'alike': 0}, <User: user19>: {'diff': 50, 'alike': 0}, <User: user20>: {'diff': 50, 'alike': 0}}
Run Code Online (Sandbox Code Playgroud)
然后我对它进行排序:
sorted(dict) == [{'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'d
iff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 50, 'alike': 0}, {'diff': 45, 'alike': 1}, {'diff': 46, 'alike': 1}, {'diff'
: 46, 'alike': 1}, {'diff': 46, 'alike': 1}, {'diff': 48, 'alike': 1}, {'diff': 49, 'alike': 1}, {'diff': 42, 'alike': 2}, {'diff': 43, 'alike': 2}, {'diff': 37
, 'alike': 3}]
Run Code Online (Sandbox Code Playgroud)
我如何按"差异"排序?
首先,你没有排序dict- 你正在排序列表dicts- 这些是非常不同的东西,尤其是dict在Python中没有定义的顺序.
您可以使用sorted()和轻松完成此操作operator.itemgetter():
import operator
sorted_dicts = sorted(dicts, key=operator.itemgetter("diff"))
Run Code Online (Sandbox Code Playgroud)
所述sorted()内置取key关键字参数,这是一个函数,它接受的值,并且给出了另一个值进行排序.在这里,我们使用an itemgetter()从中获取所需的值以dict进行排序.
鉴于您的变化,有两个答案,因为您不清楚.如果您想要值列表,只需从原始列表中提取它们dict:
sorted(users.values(), key=operator.itemgetter("diff"))
Run Code Online (Sandbox Code Playgroud)
这就像服用一样简单dict.values().当然,在Python 2.x下,您将希望使用viewitems()或iteritems()获得良好的性能.
如果你想dict对它自己进行排序,这是另一回事,因为dicts(正如我所说的)本质上是无序的.
首先,我想要注意的是sorted(dict),没有产生你建议的输出 - 一个dict迭代键,而不是默认值:
users = {
'<User: user10>': {'alike': 1, 'diff': 46},
'<User: user11>': {'alike': 3, 'diff': 37},
'<User: user12>': {'alike': 0, 'diff': 50},
'<User: user13>': {'alike': 0, 'diff': 50},
'<User: user14>': {'alike': 0, 'diff': 50},
'<User: user15>': {'alike': 0, 'diff': 50},
'<User: user16>': {'alike': 0, 'diff': 50},
'<User: user17>': {'alike': 0, 'diff': 50},
'<User: user18>': {'alike': 0, 'diff': 50},
'<User: user19>': {'alike': 0, 'diff': 50},
'<User: user20>': {'alike': 0, 'diff': 50},
'<User: user2>': {'alike': 1, 'diff': 48},
'<User: user3>': {'alike': 2, 'diff': 42},
'<User: user4>': {'alike': 1, 'diff': 45},
'<User: user5>': {'alike': 2, 'diff': 43},
'<User: user6>': {'alike': 1, 'diff': 46},
'<User: user7>': {'alike': 1, 'diff': 46},
'<User: user8>': {'alike': 1, 'diff': 49},
'<User: user9>': {'alike': 0, 'diff': 50}
}
print(sorted(users))
Run Code Online (Sandbox Code Playgroud)
给我们:
['<User: user10>', '<User: user11>', '<User: user12>', '<User: user13>', '<User: user14>', '<User: user15>', '<User: user16>', '<User: user17>', '<User: user18>', '<User: user19>', '<User: user20>', '<User: user2>', '<User: user3>', '<User: user4>', '<User: user5>', '<User: user6>', '<User: user7>', '<User: user8>', '<User: user9>']
Run Code Online (Sandbox Code Playgroud)
要生成排序dict,我们需要使用collections.OrderedDict():
import collections
users = {
'<User: user10>': {'alike': 1, 'diff': 46},
'<User: user11>': {'alike': 3, 'diff': 37},
'<User: user12>': {'alike': 0, 'diff': 50},
'<User: user13>': {'alike': 0, 'diff': 50},
'<User: user14>': {'alike': 0, 'diff': 50},
'<User: user15>': {'alike': 0, 'diff': 50},
'<User: user16>': {'alike': 0, 'diff': 50},
'<User: user17>': {'alike': 0, 'diff': 50},
'<User: user18>': {'alike': 0, 'diff': 50},
'<User: user19>': {'alike': 0, 'diff': 50},
'<User: user20>': {'alike': 0, 'diff': 50},
'<User: user2>': {'alike': 1, 'diff': 48},
'<User: user3>': {'alike': 2, 'diff': 42},
'<User: user4>': {'alike': 1, 'diff': 45},
'<User: user5>': {'alike': 2, 'diff': 43},
'<User: user6>': {'alike': 1, 'diff': 46},
'<User: user7>': {'alike': 1, 'diff': 46},
'<User: user8>': {'alike': 1, 'diff': 49},
'<User: user9>': {'alike': 0, 'diff': 50}
}
print(collections.OrderedDict(sorted(users.items(), key=lambda x: x[1]["diff"])))
Run Code Online (Sandbox Code Playgroud)
这给了我们:
OrderedDict([('<User: user11>', {'diff': 37, 'alike': 3}), ('<User: user3>', {'diff': 42, 'alike': 2}), ('<User: user5>', {'diff': 43, 'alike': 2}), ('<User: user4>', {'diff': 45, 'alike': 1}), ('<User: user10>', {'diff': 46, 'alike': 1}), ('<User: user7>', {'diff': 46, 'alike': 1}), ('<User: user6>', {'diff': 46, 'alike': 1}), ('<User: user2>', {'diff': 48, 'alike': 1}), ('<User: user8>', {'diff': 49, 'alike': 1}), ('<User: user20>', {'diff': 50, 'alike': 0}), ('<User: user9>', {'diff': 50, 'alike': 0}), ('<User: user13>', {'diff': 50, 'alike': 0}), ('<User: user19>', {'diff': 50, 'alike': 0}), ('<User: user12>', {'diff': 50, 'alike': 0}), ('<User: user18>', {'diff': 50, 'alike': 0}), ('<User: user15>', {'diff': 50, 'alike': 0}), ('<User: user14>', {'diff': 50, 'alike': 0}), ('<User: user17>', {'diff': 50, 'alike': 0}), ('<User: user16>', {'diff': 50, 'alike': 0})])
Run Code Online (Sandbox Code Playgroud)
请注意,这里我们必须使用lambda关键参数的语句,因为itemgetter()遗憾的是我们无法获得多个级别的项目.
sorted(your_list, key=lambda el: el["diff"])
Run Code Online (Sandbox Code Playgroud)
该key关键字的参数应该是一个函数,要排序列表中的一个元素,并返回应在排序比较中使用的值. lambda是简写def- 也就是说,它定义了一个函数(有几个限制).同样的行可以这样写:
def get_key(el):
return el["diff"]
sorted(your_list, key=get_key)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |