我有一本字典词典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
我在这里做错了什么?我怎么能解决这个问题?
答案 0 :(得分:5)
嗯,你的语法错了,但你有正确的想法。使用max
和dict.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']}
返回
list
n
个最常见的元素及其数量,从最常见到最少。如果省略n
或None
,most_common()
将返回计数器中的所有元素。具有相同计数的元素是任意排序的: