Python项仅按项中的第一个单词排序



尝试按相同项目的数量排序,从最大到最小的项目计数…有一个数组:

[['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]]

美好的一天!