Найти элемент с наибольшим счетом в словаре словаря - PullRequest
0 голосов
/ 28 мая 2018

У меня есть словарь словаря myDict:

myDict = { 'cow': {'A':2, 'B':5, 'C':3},
           'cat': {'A':7, 'B':1, 'C':6},
           'dog': {'A':1, 'B':4, 'C':3},
           'bird': {'A':5, 'B':7, 'C':9}
         }

Я хочу найти элемент верхнего счета для каждого животного в этом случае, т.е. вывод должен быть:

myNewTable = {'cow':'B', 'cat':'A', 'dog':'B', 'bird':'C'}

Я пытался добиться этого, используя следующий код:

 myNewTable = max(x.items(), key=operator.itemgetter(1))[0] for x in myDict

, но получил следующую ошибку:

File "<ipython-input-11-3bcb909a6476>", line 28
    myNewTable = max(x.items(), key=operator.itemgetter(1))[0] for x in myDict
                                                                ^
SyntaxError: invalid syntax

Что я здесь не так сделал?И как я мог это исправить?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Вы используете синтаксис понимания, но не обернули его в определенный тип (например, list => [], set => {}, dict => {:}).Так что исправляя ваш код, он будет выглядеть так:

In []:
[max(myDict[x].items(), key=operator.itemgetter(1))[0] for x in myDict]

Out[]:
['B', 'A', 'B', 'C']

Но вы хотели это как dict, так что, возможно, вы имели в виду:

In []:
{x: max(myDict[x].items(), key=operator.itemgetter(1))[0] for x in myDict}

Out[]:
{'bird': 'C', 'cat': 'A', 'cow': 'B', 'dog': 'B'}

Но можно указать более кратко (какза ответ @ coldspeed):

{x: max(myDict[x], key=myDict[x].get) for x in myDict}
0 голосов
/ 28 мая 2018

Другой вариант, использующий collections.Counter с его .most_common(...) методом:

>>> from collections import Counter

>>> {k: Counter(v).most_common(1)[0][0] for k, v in myDict.items()}
{'cat': 'A', 'bird': 'C', 'cow': 'B', 'dog': 'B'}

Это будет полезно в общем случае , если вы хотитевыберите более одного элемента с наибольшим количеством из вложенного dict .Например, ниже приведен пример выбора списка двух наиболее распространенных ключей в dict:

>>> {k: [x[0] for x in Counter(v).most_common(2)] for k, v in myDict.items()}
{'dog': ['B', 'C'], 'bird': ['C', 'B'], 'cat': ['A', 'C'], 'cow': ['B', 'C']}

Из Counter.most_common([n]) документа :

Возвращает list из n наиболее распространенных элементов и их количество от самых распространенных до наименьших.Если n опущено или None, most_common() возвращает все элементы в счетчике.Элементы с равным количеством упорядочены произвольно:

0 голосов
/ 28 мая 2018

Хорошо, ваш синтаксис неправильный, но у вас правильная идея.Хорошее и краткое решение, использующее max и dict.get, может быть построено путем итерации по myDict:

>>> {k : max(v, key=v.get) for k, v in myDict.items()}
{'bird': 'C', 'cat': 'A', 'cow': 'B', 'dog': 'B'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...