2013-11-17 2 views
2

У меня есть счетчик, как это:Встречное к списку

counter = Counter(['a','a','b','b','b','c']) 

, который дает этот объект:

Counter({'b': 3, 'a': 2, 'c': 1}) 

и от этого я хочу создающих список таких как:

list[0] = 'b' 
list[1] = 'a' 
list[2] = 'c' 

любая идея сделать это самым простым и быстрым способом, пожалуйста? Метод благодаря

+1

Какой порядок вы хотите для элементов списка? Что вы пробовали? –

ответ

4

Вы можете использовать collections.Counter.most_common (который возвращает список п наиболее распространенные элементы и их считается от самого общего до наименее):

>>> counter.most_common() 
[('b', 3), ('a', 2), ('c', 1)] 

>>> [key for key, _ in counter.most_common()] 
['b', 'a', 'c'] 
2

Простейшие (ИМО), рассказанная falsetru

sorted(counter, key=counter.get, reverse=True) 

Значение выше будет сортировать счетчик dict на основе значений ключей (.get()) & возвращают обращенную list.

+0

Спасибо Ashish, это то, что я ищу, за исключением того, что ваш код дает мне восходящий порядок, что я могу изменить, чтобы я мог получить убывающий порядок. – user2741700

+0

Просто добавьте 'reverse = True', как я сделал в обновленном ответе. –

+0

Или вы можете сделать «обратный» (отсортированный (counter.keys(), key = lambda x: counter [x]) ' –

0

Вы можете бросить его в список, но он не будет держать заказ вы хотите, так как словари несортированные:

list1 = list(counter) 
0

Если вы хотите, чтобы упустить все шаги, которые вы можете ввести.

list(set(['a','a','b','b','b','c'])) 
0

Вы можете сделать это:

from collections import Counter 
import operator 

counter = Counter(['a','a','b','b','b','c']) 
print [k for k,v in sorted(counter.iteritems(), key=operator.itemgetter(1), reverse=True)] 
# ['b', 'a', 'c'] 

Или еще лучше:

from collections import Counter 

counter = Counter(['a','a','b','b','b','c']) 
print [k for k,v in counter.most_common()]