尝试按相同项目的数量排序,从最大到最小的项目计数…有一个数组:
[['red', 1], ['blue', 2], ['blue', 3], ['green', 4], ['red', 5], ['red', 6]]
需要输出:
[['red', 1],
['red', 5],
['red', 6],
['blue', 2],
['blue', 3],
['green', 4]]
尝试使用集合计数器,但我不知道如何计数只有单词…也许有人能帮我。
你可以像下面这样使用Counter:
from collections import Counter
data = [['red', 1], ['blue', 2], ['blue', 3], ['green', 4], ['red', 5], ['red', 6]]
counts = Counter(e for e, _ in data)
result = sorted(data, key=lambda e: counts.get(e[0], 0), reverse=True)
print(result)
[['red', 1], ['red', 5], ['red', 6], ['blue', 2], ['blue', 3], ['green', 4]]
如果count在同一个列表中使用,您可以按照@Barmar:
的建议做:result = sorted(data, key=lambda e: counts[e[0]], reverse=True)
以下是非Counter版本:
lol=[['red', 1],
['red', 5],
['red', 6],
['blue', 2],
['blue', 3],
['green', 4]]
cnt={}
for color, x in lol:
cnt[color]=cnt.get(color, 0)+x
print(sorted(lol, key=lambda sl: (cnt[sl[0]], sl[1]), reverse=True))
# [['red', 6], ['red', 5], ['red', 1], ['blue', 3], ['blue', 2], ['green', 4]]
由于这是创建一个(total_cnt_by_color, count_for_this_element)
的元组,因此它根据组计数和每个列表条目的单个计数进行排序。如果不需要,请删除元组的第二个元素。
如果你想要一个颜色出现的次数vs该颜色值的总和,你可以这样做:
for color, x in lol:
cnt[color]=cnt.get(color, 0)+1
print(sorted(lol, key=lambda sl: (cnt[sl[0]], sl[1]), reverse=True))
我编辑了上面的代码,以便它真正适用于所有给定的情况。上面提供的解决方案的问题是,它根据组合的所有颜色项的值进行排序,而不是它们的出现次数。如果有人要将蓝色项的值更改为12和13,那么给定的解决方案就会中断,因为现在12和13大于6、5和1,而6、5和1是红色项的排序数。我所做的唯一更改是,我没有在for循环中添加颜色的值,而是添加1来表示又处理了一个给定项。请看下面我的解决方案。
lol=[['red', 1],
['red', 5],
['red', 6],
['blue', 12], #when set to these values, the previous solution
['blue', 13], #would break
['green', 4]]
cnt={}
for color, x in lol:
cnt[color]=cnt.get(color, 0)+1 # Here 1 is added
print(sorted(lol, key=lambda sl: (cnt[sl[0]], sl[1]), reverse=True))
# [['red', 6], ['red', 5], ['red', 1], ['blue', 13], ['blue', 12], ['green',
# 4]]
美好的一天!