如何使用sorted()方法对对列表进行排序?

时间:2015-09-07 10:57:13

标签: python sorting

  

定义一个函数,histo(s)计算给定的直方图   串。字符必须出现在从至少排序的列表中   频繁到频繁。例如,histo('implemented')是   [('t', 1), ('p', 1), ('n', 1), ('l', 1), ('i', 1), ('d', 1), ('m', 2), ('e', 3)]。 (频率相同的字符必须出现在   递减按字母顺序排序。)要实现排序,请使用python内置函数sorted

这是我的工作:

def keyf(p):
    x,y = p
    return (y,x)

s = "implemented"
d = {}
for c in s:
    d[c] = d.get(c, 0) + 1
dlist = list(d.items())
dlist = sorted(dlist, key = keyf, reverse = False)

运行后,dlist为[('d', 1), ('i', 1), ('l', 1), ('n', 1), ('p', 1), ('t', 1), ('m', 2), ('e', 3)]。问题是该对的第一个元素具有相同的频率不是降序,我该如何解决这个问题? 我试图把

dlist = sorted(dlist, reverse = True)

最后,但它不起作用。

4 个答案:

答案 0 :(得分:3)

您可以反转键功能中字符的顺序:

def keyf(p):
    x,y = p
    return (y,-ord(x))

答案 1 :(得分:2)

假设您想要的结果是 -

[('t',1),('p',1),('n',1),('l',1),('i',1),('d',1 ),('m',2),('e',3)]

在这种情况下,您需要对两个条件进行排序,频率的升序 alphbet 的降序(对于相同的频率)。为此,您需要将第一个更改为负频率的降序,使两个排序条件按降序排列,然后按降序排序完整列表(或者您可以执行相反的操作,并排序完整列表按升序排列)。示例 -

>>> def keyf(p):
...     x,y = p
...     return (-y,x)
...
>>> s = "implemented"
>>> d = {}
>>> for c in s:
...     d[c] = d.get(c, 0) + 1
...
>>>
>>> dlist = list(d.items())
>>> dlist = sorted(dlist, key = keyf, reverse = True)
>>> print(dlist)
[('t', 1), ('p', 1), ('n', 1), ('l', 1), ('i', 1), ('d', 1), ('m', 2), ('e', 3)]

答案 2 :(得分:1)

自定义键传递给sorted函数。要实现递减的字母顺序字母,请按ord转换为ascii代码并取消。

from collections import Counter

def histo(s):
    c = Counter(s)
    return sorted(c.iteritems(), key=lambda item: (item[1], -ord(item[0])))

expected = [('t', 1), ('p', 1), ('n', 1), ('l', 1), ('i', 1), ('d', 1), ('m', 2), ('e', 3)]
assert histo('implemented') == expected 

答案 3 :(得分:0)

使用cmp函数进行双重排序:

>>> aList
[('d', 1), ('e', 3), ('i', 1), ('l', 1), ('m', 2), ('n', 1), ('p', 1), ('t', 1)]
>>> sorted(aList, cmp = lambda x, y: cmp(x[1],y[1]) if cmp(x[1],y[1]) else cmp(y[0],x[0]))
[('t', 1), ('p', 1), ('n', 1), ('l', 1), ('i', 1), ('d', 1), ('m', 2), ('e', 3)]