在字典的字典中查找最高计数元素

时间:2018-05-27 21:36:50

标签: python dictionary

我有一本字典词典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 :(得分:5)

嗯,你的语法错了,但你有正确的想法。使用maxdict.get的简洁解决方案可以通过迭代myDict来构建:

>>> {k : max(v, key=v.get) for k, v in myDict.items()}
{'bird': 'C', 'cat': 'A', 'cow': 'B', 'dog': 'B'}

答案 1 :(得分:3)

您使用的是理解语法,但并未将其包装在特定类型中(例如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&#39;答案):

{x: max(myDict[x], key=myDict[x].get) for x in myDict}

答案 2 :(得分:1)

使用collections.Counter方法{/ 3}}的另一种方法:

>>> 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中两个最常用键列表的示例:

>>> {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']}

来自.most_common(...)

  

返回list n个最常见的元素及其数量,从最常见到最少。如果省略nNonemost_common()将返回计数器中的所有元素。具有相同计数的元素是任意排序的: