2016-02-17 19 views
5

Tôi có mộtLàm thế nào để sắp xếp một danh sách với mục trùng lặp bằng của số lớn nhất của lần xuất hiện trùng lặp - Python

list1 = ["one", "two", "two", "three", "four" , "five", "five", "five", "six"] 

và đầu ra nên

list2 = ["five" , "two", "one", "three" , "six"] 
  • "five" là yếu tố đầu tiên bởi vì trong list1 có số lần xuất hiện cao nhất (3)
  • "two "là phần tử thứ hai bởi vì trong list1 có số lượng cao nhất tiếp theo ccurrences (2)
  • "one", "three "và "six" có cùng số lần xuất hiện thấp hơn (1) vì vậy chúng là số cuối cùng trong số list2 của tôi - Không quan trọng họ sẽ ở vị trí nào sau" năm "và" hai ". Tóm lại, list2 = ["five" , "two", "six", "three" , "one"] hoặc list2 = ["five" , "two", "three", "one" , "six"] hoặc bất kỳ biến thể nào khác được chấp nhận.

tôi có thể giải quyết điều này bằng cách tạo ra một từ điển để lưu trữ các số lần xuất hiện và sau đó tạo ra một danh sách mới với các mặt hàng của tôi ra lệnh bằng dict

my_dict = {i:list1.count(i) for i in list1} 

nhưng tôi cần một cái gì đó sạch

Trả lời

6

Bạn có thể sử dụng tính năng hiểu danh sách và Counter:

from collections import Counter 
print([element for element,count in Counter(list1).most_common()]) 

Đầu ra:

['five', 'two', 'three', 'six', 'four', 'one'] 
+0

Đó chính xác là những gì tôi cần. @ lừa-kong Cảm ơn bạn! – faceoff

1

Bạn có thể sử dụng itertools.groupby() để có được một danh sách được sắp xếp theo số lần xuất hiện:

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

Nếu bản sao được đã được nhóm vào list1 (như trong câu hỏi của bạn), sau đó bạn có thể hủy cuộc gọi sorted(). groupby() có thể hiệu quả hơn (bộ nhớ/thời gian) so với collections.Counter() - đo lường nếu nó quan trọng trong trường hợp của bạn.

-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 
Các vấn đề liên quan