2016-11-14 4 views
0

Я пишу функцию, которая подсчитывает количество раз, когда страна появляется в словаре и возвращает страну, которая больше всего появилась. Если больше одной страны появляется больше всего, она должна вернуть список стран.Python Страны счётчика

Пример словаря:

{'Leonardo da Vinci': [("Portrait of Isabella d'Este", 1499, 63.0, 46.0, 'chalk', 'France'), ('The Last 
    Supper', 1495, 460.0, 880.0, 'tempera', 'Italy')], 'Pablo Picasso': [('Guernica', 1937, 
    349.0, 776.0, 'oil paint', 'Spain')]} 

Поскольку Франция, Италия, Испания и все появляются только один раз в этом словаре функция должна возвращать

countries_appeared_most(dictionary1()) 

['France', 'Italy', 'Spain'] 

Если одна из этих стран вместо того, чтобы появились 2 или 3 раз функция вернула бы эту страну. В текущем коде, который у меня ниже, поиск самого исполнителя, который появляется больше всего, но я считаю, что пара небольших изменений может помочь мне вместо этого вернуть страну, которая больше всего выглядит. Кто-нибудь есть советы о том, как это сделать? Спасибо за помощь

Код:

def countries_appeared_most(db): 
    if not db: 
      return None 
    maxcount = max(len(v) for v in db.values()) 
    themax = [k for k, v in db.items() if len(v) == maxcount] 
    themax.sort() 
    return themax 

ответ

3
counter = {} 
for painting_list in db.values(): 
    for painting in painting_list: 
     country = painting[-1] 
     counter[country] = counter.get(country, 0) + 1 
maxcount = max(counter.values()) 
themax = [k for k, count in counter.items() if count == maxcount] 
+0

Спасибо, что есть способ сделать это без импорта счетчика? Я должен был четко прояснить этот вопрос, но мой код не зависит от импорта – warrior4223

+0

@ warrior4223. –

+0

Спасибо, я ценю это. Я получаю счетчик ошибок не определен. Я попробую изменить имя на что-то еще. – warrior4223

1

Свести значения, чтобы получить список стран:

>>> [x[-1] for X in d.values() for x in X] 
['Spain', 'France', 'Italy'] 

И Counter может дать вам наиболее частые из них непосредственно:

>>> from collections import Counter 
>>> countries = [x[-1] for X in d.values() for x in X] 
>>> Counter(countries).most_common() 
[('Italy', 1), ('Spain', 1), ('France', 1)] 
+0

Есть ли способ сделать это без счетчика? Извините, я должен был упомянуть об этом в вопросе, но мой код должен быть простым и не полагаться на импорт. – warrior4223

+0

Извините, но я не отвечаю на вопросы с произвольными ограничениями. Модуль коллекций является основной библиотекой, поэтому нет причин не импортировать и использовать его. – wim

+0

@ warrior4223 _ "мой код должен быть прост и не полагаться на импорт **" _ - Что вы имеете в виду? Часть вашего кода проста _is_, полагаясь на импорт. импорт избавляет вас от необходимости «изобретать колесо» каждый раз, когда вам нужна определенная функция/класс. –