在一个字典的字典中找到出现次数最多的元素

3
我有一个名为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个回答

5

好的,你的语法有问题,但你的想法是正确的。可以使用 maxdict.get 来构建一个简洁的解决方案,并通过迭代 myDict 进一步完善:

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

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的回答):

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

1

另一个选择是使用 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'}

如果您想从嵌套字典中选择多个最高计数元素,则此功能通常很有用。例如,以下是选择字典中两个最常见键的示例:

>>> {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])文档:

从最常见的到最不常见的顺序,返回包含前 n 个元素及其计数的列表。 如果省略了参数 n 或者使用了None,则 most_common() 将返回计数器中所有元素。 计数相等的元素将被任意排序:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接