我有一个号码清单清单: [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)
答案 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]