2013-10-30 113 views
2

我有一個字符串列表tags,我希望按列表中字符串的出現次數排序。Python按列表中字符串的出現次數排序字符串

我曾嘗試:

創建獨特的字符串列表,

uniqueTags = set(tags) 

然後爲每個唯一字符串的創建與數第二列表

countList = [] 
for items in uniqueTags: 
    countList.append(tags.count(items)) 

後來我我不知道如何排序。

回答

6

改爲使用collections.Counter(...)

In [18]: from collections import Counter 

In [19]: m = ['a', 'b', 'a', 'b', 'c'] 

In [20]: Counter(m).most_common() 
Out[20]: [('a', 2), ('b', 2), ('c', 1)] 

Counter.most_common()返回一個元組的列表,使得第一元素是字符串,第二個是它的數量和名單是由數排序。

In [21]: m2 = ['a', 'b', 'a', 'b', 'c', 'b'] 

In [22]: Counter(m2).most_common() 
Out[22]: [('b', 3), ('a', 2), ('c', 1)] 

只是爲了得到項目的列表,你可以做

In [28]: [elem for elem, _ in Counter(m2).most_common()] 
Out[28]: ['b', 'a', 'c'] 

如果你正在尋找排序你得到的名單,改變你的方法類似

In [23]: final_list = [] 

In [24]: for elem in set(m2): 
    ...:  final_list.append((elem, m2.count(elem))) 
    ...:  

In [25]: from operator import itemgetter 

In [26]: sorted(final_list, key=itemgetter(1)) 
Out[26]: [('c', 1), ('a', 2), ('b', 3)] 

In [27]: sorted(final_list, key=itemgetter(1), reverse=True) 
Out[27]: [('b', 3), ('a', 2), ('c', 1)] 
+1

+1對於使用標準rd圖書館。 – Exelian

+1

當然,爲了得到一個項目列表:'[x for x,_ in Counter(m).most_common()]''。 – poke

+0

偉大的圖書館。謝謝;這正是我需要的。 – tucson

1

這是一種方法:

from collections import Counter 
from operator import itemgetter 
get_val = itemgetter(0) 

def retrieve_unique_sorted_by_count(lst) 
    return [get_val(x) for x in Counter(lst).most_common()]