根据频率以降序对列表进行排序

时间:2019-07-30 10:49:00

标签: python-3.x

我有一个号码清单清单:     [1、2、3、1、1、2、3、1、2、3]。 我想按元素的频率对它进行排序以获得:     [1、1、1、1、3、3、3、2、2、2]。

如果几个元素具有相同的频率,请按降序对它们进行排序。您能找到任何方法做到这一点吗?我正在使用上述方法,但输出为:[1、1、1、1、2、2、2、3、3、3]。

from collections import Counter 
list = [1, 2, 3, 1, 1, 2, 3, 1, 2, 3]
c = Counter(list)
x = sorted(c.most_common(), key=lambda x: (-x[1], x[0])) 
y = [([v] * n) for (v, n) in x]
z = sum(y, [])
print(z)

2 个答案:

答案 0 :(得分:3)

您似乎需要使用reverse=True

例如:

from collections import Counter 

data = [1, 2, 3, 1, 1, 2, 3, 1, 2, 3]
c = Counter(data)

data.sort(key=lambda x: (c[x], x), reverse=True)
print(data)

输出:

[1, 1, 1, 1, 3, 3, 3, 2, 2, 2]

答案 1 :(得分:1)

如果列表很长,则可能只需要对出现次数相同的项目进行排序:

from collections import Counter
from itertools import groupby

lst = [1, 2, 3, 1, 1, 2, 3, 1, 2, 3]
c = Counter(lst)

ret = []
for key, group in groupby(c.most_common(), key=lambda x: x[1]):
    items = sorted((item for item, _ in group), reverse=True)
    for item in items:
        ret.extend(key * [item])
print(ret)
# [1, 1, 1, 1, 3, 3, 3, 2, 2, 2]