我有一个
list1 = ["one", "two", "two", "three", "four" , "five", "five", "five", "six"]
,输出应为
list2 = ["five" , "two", "one", "three" , "six"]
"five"
是第一个元素,因为在list1中出现的次数最多(3)"two
"是第二个元素,因为在list1中出现次数最多(2)"one"
,"three
"并且"six"
具有相同较低的出现次数(1)因此它们是我list2
中的最后一次 - 只要它们在&#之后它们将处于什么位置并不重要34; 5"和"两个"。简而言之,我们接受list2 = ["five" , "two", "six", "three" , "one"]
或list2 = ["five" , "two", "three", "one" , "six"]
或任何其他变体。我可以通过创建一个字典来存储出现次数来解决这个问题,然后使用dict命令我的项目创建一个新列表
my_dict = {i:list1.count(i) for i in list1}
但我需要更清洁的东西
答案 0 :(得分:6)
您可以使用列表理解和Counter
:
from collections import Counter
print([element for element,count in Counter(list1).most_common()])
输出:
['five', 'two', 'three', 'six', 'four', 'one']
答案 1 :(得分:1)
您可以使用itertools.groupby()
获取按出现次数排序的列表:
from itertools import groupby
from operator import itemgetter
grouped = [(uniq, len(list(dups)))
for uniq, dups in groupby(sorted(list1))] # group & count
grouped.sort(key=itemgetter(1), reverse=True) # sort by occurrence
list2 = list(map(itemgetter(0), grouped))
如果重复项已经在list1
中分组(就像您的问题中一样),那么您可以放弃sorted()
来电。 groupby()
可能比collections.Counter()
更有效(记忆/时间) - 如果它在您的情况下很重要,请对其进行衡量。
答案 2 :(得分:0)
使用计数器集合这是它的特定用途
答案 3 :(得分:-1)
a= ["one", "two", "two", "three", "four" , "five", "five", "five", "six"]
dic={}
for name in a:
if name in dic:
dic[name]=dic[name]+1
else:
dic[name]=1
keyList=[]
valueList=dic.values()
valueList.sort()
valueList.reverse()
def get_Value(dic,value):
for name in dic:
if dic[name] == value:
del dic[name]
return name
for num in valueList:
keyList.append(get_Value(dic,num))
print keyList