-1

例如,我有以下列表,其中每个元素的出现次数为:

apple - 3
banana - 4
orange - 2

名单:

["apple", "apple", "banana", "orange", "orange", "banana", "banana", "apple", "banana"]

我需要按流行度对列表进行排序,没有重复,所以预期的结果是:

["banana", "apple", "orange"]

我考虑过创建一个以每个元素为键的字典,遍历列表,然后在每次找到键时添加 +1,所以我最终会得到一个示例字典:

dic = {"apple": 3, "banana": 4, "orange":2}

但是有点坚持如何在没有欺骗的情况下对列表本身进行排序..

提前致谢。

编辑:谢谢大家,我不知道计数器。节日快乐!

4

5 回答 5

4

您可以使用 acollections.Counter及其most_common方法:

from collections import Counter

lst = ["apple", "apple", "banana", "orange", "orange", "banana", "banana", "apple", "banana"]

res = [k for k, _ in Counter(lst).most_common()]
# ['banana', 'apple', 'orange']
于 2018-12-25T16:10:05.677 回答
4

使用计数器

from collections import Counter

data = ["apple", "apple", "banana", "orange", "orange", "banana", "banana", "apple", "banana"]

counts = Counter(data)
result = sorted(counts, key=counts.get, reverse=True)
print(result)

输出

['banana', 'apple', 'orange']
于 2018-12-25T16:09:32.660 回答
1

根据原始列表的计数对集合进行排序。编辑:正如评论中指出的那样,如果您有很多候选人,您可能想要使用其他解决方案,多次调用列表的计数方法并不是最佳的。

a = ["apple", "apple", "banana", "orange", "orange", "banana", "banana", "apple", "banana"]
sorted(set(a), key = lambda x: a.count(x), reverse = True) #reverse for descending

结果:

['banana', 'apple', 'orange']
于 2018-12-25T16:10:03.717 回答
0
from itertools import groupby

L = ["apple", "apple", "banana", "orange", "orange", "banana", "banana", "apple", "banana"] # Input list

counts = [(i, len(list(c))) for i,c in groupby(sorted(L))]      # Create value-count pairs as list of tuples 
counts =  sorted(counts, key = lambda i: i[1] , reverse=True)    #sort value-count list
out = [key for key, value in counts]   #extract key
print (out)
于 2018-12-25T16:11:52.313 回答
0

使用listset

a = ["apple", "apple", "banana", "orange", "orange", "banana", "banana", "apple", "banana"]
result =sorted(list(set(a)))

输出 :

['apple', 'banana', 'orange']
于 2018-12-25T16:54:03.937 回答