定义一个函数,
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)
最后,但它不起作用。
答案 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)]