2013-12-08 2 views
0

Я считаю, что это должно быть довольно просто, но, похоже, я не могу думать прямо, чтобы понять это правильно.Выбор всех верхних слов в списке Python с использованием счетчика

У меня есть список следующим образом:

comp = [Amazon, Apple, Microsoft, Google, Amazon, Ebay, Apple, Paypal, Google] 

Я просто хочу, чтобы напечатать слова, которые происходят в наибольшей степени. Я сделал следующее:

cnt = Counter(comp.split(',')) 
final_list = cnt.most_common(2) 

Это дает мне следующий вывод:

[[('Amazon', 2), ('Apple', 2)]] 

Я не уверен, что параметр проходят в most_common(), так как он может быть различным для каждого входного списка. Итак, я хотел бы знать, как я могу напечатать верхние встречающиеся слова, будь то 3 для одного списка или 4 для другого. Таким образом, для приведенного выше образца, то выход будет выглядеть следующим образом:

[[('Amazon', 2), ('Apple', 2), ('Google',2)]] 

Благодарности

+0

Вы используете Python 2.7 или Python 3.2? Можете ли вы дать нам более подробную информацию? – Bugboy1028

+0

Я нахожусь на Python 2.7 – visakh

+0

Amazon повторяется 3 раза в списке, и ваш результат говорит 2. –

ответ

3

Вы можете использовать itertools.takewhile здесь:

>>> from itertools import takewhile 
>>> lis = ['Amazon', 'Apple', 'Microsoft', 'Google', 'Amazon', 'Ebay', 'Apple', 'Paypal', 'Google'] 
>>> c = Counter(lis) 
>>> items = c.most_common() 

Получить максимальное количество:

>>> max_ = items[0][1] 

Выберите только те пункты, где найдены счетчик = max_, и остановится, как только в качестве элемента с меньшим кол:

>>> list(takewhile(lambda x: x[1]==max_, items)) 
[('Google', 2), ('Apple', 2), ('Amazon', 2)] 

Вы неправильно поняли Counter.most_common:

most_common(self, n=None) 

Список n наиболее распространенных элементов и их количество от самых распространенных . Если n - None, тогда список всех элементов подсчитывается.

i.e n не является счет здесь, это количество элементов, которые вы хотите вернуть. Он по существу эквивалентен:

>>> c.most_common(4) 
[('Google', 2), ('Apple', 2), ('Amazon', 2), ('Paypal', 1)] 
>>> c.most_common()[:4] 
[('Google', 2), ('Apple', 2), ('Amazon', 2), ('Paypal', 1)] 
3

Вы можете сделать это путем сохранения двух переменных maxi и maxi_value не сохраняя максимальный элемент и не раз это произошло.

dict = {} 
maxi = None 
maxi_value = 0 
for elem in comp: 
    try: 
     dict[elem] += 1 
    except IndexError: 
     dict[elem] = 1 
    if dict[elem] > mini_value: 
     mini = elem 
print (maxi) 
1

Найти число вхождений одного из лучших слов, а затем отфильтровать весь список возвращенное most_common:

>>> mc = cnt.most_common() 
>>> filter(lambda t: t[1] == mc[0][1], mc) 
Смежные вопросы