我有字典
dict = {key: [a, b, c, d]}
键是一个str,a是一个数字,b是一个数字,c是一个数字,d是一个数字。
如何打印我的字典,该字典首先按d中的数字排序, 然后 ,按密钥中字符串的长度排序(最大)。
我尝试使用类似这样的东西...
for key in sorted(dict.items(), key=lambda x: (-len(x[0]), x[1][3])):
但是我不断收到属性错误。
答案 0 :(得分:2)
字典是无序集合,除非您使用的是Python 3.6+。因此,我假设您要根据自己的2条条件构造一个OrderedDict
。为此,您可以将sorted
与自定义键一起使用,然后输入OrderedDict
:
from collections import OrderedDict
d = {'ads': [4, 6, 1, 4], 'bs': [1, 3, 1, 9], 'cfsdg': [6, 1, 5, 4], 'ddsf': [5, 1, 6, 4]}
res = OrderedDict(sorted(d.items(), key=lambda x: (x[1][-1], -len(x[0]))))
OrderedDict([('cfsdg', [6, 1, 5, 4]),
('ddsf', [5, 1, 6, 4]),
('ads', [4, 6, 1, 4]),
('bs', [1, 3, 1, 9])])
答案 1 :(得分:2)
您可以执行以下操作:
>>> dictionary = {'aaaa': [1,2,2,3], 'aa': [1,2,2,3], 'aaa': [2,2,2,2], 'a': [4,2,2,6]}
>>> arr = sorted(dictionary.items(), key=lambda x: (-x[1][3],-len(x[0])))
>>> for k in arr:
print(k)
('a', [4, 2, 2, 6])
('aaaa', [1, 2, 2, 3])
('aa', [1, 2, 2, 3])
('aaa', [2, 2, 2, 2])
请注意:首先按较大的d
排序,然后按较长的key
排序。
要颠倒任何优先级的顺序,只需尝试在-
函数中将lambda
删除/保留在tupple的元素中即可。
答案 2 :(得分:0)
(无耻地窃取jpp的示例字典)
您可以这样做:
di = {'ads': [4, 6, 1, 4], 'bs': [1, 3, 1, 9], 'cfsdg': [6, 1, 5, 4], 'ddsf': [5, 1, 6, 4]}
print('\n'.join(map(str, sorted(di.items(), key=lambda t: (t[1][-1], -len(t[0]))))))
打印:
('cfsdg', [6, 1, 5, 4])
('ddsf', [5, 1, 6, 4])
('ads', [4, 6, 1, 4])
('bs', [1, 3, 1, 9])
答案 3 :(得分:0)
您的代码有效,但可能不是您要查找的“正确”行为,因为负号错误。您的“键”变量可能做错了,因为当您使用dict.items()
进行排序时,它会返回带有(key, value)
的元组
这是一个远景,但是我想您正在尝试这样做?
for key in sorted(dict.items(), key=lambda x: (-len(x[0]), x[1][3])):
print(dict[key])
这是不正确的,因为“键”返回一个元组。
要以一种更易于理解的方式执行此操作,如下所示。
for key, value in sorted(d.items(), key=lambda x: (x[1][-1], -len(x[0]))):
print(key, value)
为什么它返回一个元组列表?因为dict.items()
是一个元组列表,并且您正在对该元组列表进行排序,而不是字典对象。
答案 4 :(得分:0)
您可以保留字典并对其进行排序,并使用dict()
构造函数
d = dict(sorted(d.items(), key=lambda x: (x[1][3], -len(x[0]))))
# {'stampede': [4, 2, 1, 1], 'the': [3, 3, 2, 1], 'vash': [1, 2, 3, 4]}