按键排序字典,然后按值排序(列表或元组?)

时间:2018-10-10 00:03:18

标签: python python-3.x algorithm sorting bioinformatics

我有字典

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])):

但是我不断收到属性错误。

5 个答案:

答案 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]}
相关问题