代码之家  ›  专栏  ›  技术社区  ›  Edamame

在字典中查找最重要的元素

  •  3
  • Edamame  · 技术社区  · 6 年前

    我有一本字典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 回复  |  直到 6 年前
        1
  •  3
  •   AChampion    6 年前

    您正在使用理解语法,但尚未将其包装为特定类型(例如 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}
    
        2
  •  5
  •   cs95 abhishek58g    6 年前

    嗯,你的语法是错误的,但你的想法是正确的。使用 max dict.get 可以通过迭代 myDict :

    >>> {k : max(v, key=v.get) for k, v in myDict.items()}
    {'bird': 'C', 'cat': 'A', 'cow': 'B', 'dog': 'B'}
    
        3
  •  1
  •   Moinuddin Quadri    6 年前

    另一种选择使用 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]) document :

    返回A list n 最常见的元素及其计数从最常见到最少。如果 n 省略或 None , most_common() 返回计数器中的所有元素。计数相等的元素任意排序: