如何通过最大数量的重复事件对具有重复项的列表进行排序 - Python

时间:2016-02-17 14:20:50

标签: python list python-3.x

我有一个

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}

但我需要更清洁的东西

4 个答案:

答案 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)

使用计数器集合这是它的特定用途

https://docs.python.org/2/library/collections.html

答案 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