【问题标题】:correcting unhashable type: 'dict_keys'更正不可散列的类型:'dict_keys'
【发布时间】:2019-01-27 19:58:30
【问题描述】:

尝试在嵌套字典中查找最大值,但显示不可散列类型:'dict_keys'错误

假设我有这本字典:

d = {'A': {'a':2, 'b':2, 'c':0},
     'B': {'a':2, 'b':0, 'c':1}}

我希望代码返回包含字典中最大值的所有键(即字典 A 中的最大值为 2,并且我希望代码返回相应的键:'a' 和' b')

['a','b']

这是我写的代码:

max_value = max(d[Capital_Alph].values()))
return [key for key, value in d[Capital_Alph].items()
        if value == max_value]

【问题讨论】:

标签: python python-3.x


【解决方案1】:

所以你有一个字典,其中一个 str 作为 value,一个 dict 作为 key,你可以这样做:

d = {'A': {'a':2, 'b':2, 'c':0},
     'B': {'a':2, 'b':0, 'c':1}}
print(list(d['A'].keys()))

返回:

['a', 'b', 'c']
[Finished in 0.8s]

对于您要完成的工作,这是一个可行的解决方案吗?

【讨论】:

  • 感谢您的回复,但实际上我希望代码返回包含最大值的所有键(即我希望代码返回字典 A 的 'a' 和 'b' 因为 2 是A) 中的最大值
【解决方案2】:

您不能使用不可散列的数据类型作为集合或字典的键。您可以通过以下方式完成任务:

d = {'A': {'a':2, 'b':2, 'c':0},
     'B': {'a':2, 'b':0, 'c':1}}

max_v = {k:max(d[k].values()) for k in d }   # get the max value of the inner dict
print(max_v)

for inner in max_v:
    print("Max keys of dict {} are: {}".format(inner, 
          [k for k,v in d[inner].items() if v == max_v[inner]]))

输出:

{'A': 2, 'B': 2} # max values of inner dicts

Max keys of dict A are: ['a', 'b']
Max keys of dict B are: ['a']

[k for k,v in d[inner].items() if v == max_v[inner]])) 部分用于获取具有相同最大值的所有内部键(如果存在多个)。

【讨论】:

    【解决方案3】:

    你的代码有两个错误:你的max_value计算中有太多)字符,你不能在函数外使用return

    但如果我解决这些问题并这样做:

    >>> d = {'A': {'a':2, 'b':2, 'c':0},
             'B': {'a':2, 'b':0, 'c':1}}
    >>> Capital_Alph = "A" 
    >>> max_value = max(d[Capital_Alph].values())
    >>> [key for key, value in d[Capital_Alph].items()
             if value == max_value]
    ['a', 'b']
    

    很明显,这里并没有太多其他错误。为避免使事情复杂化,我没有在此周围放置明显的循环:

    for Capital_Alph in d:
    

    但您可以自行管理。您的错误消息是因为您尝试将Capital_Alph 设为dict_keys 对象,即d.keys(),并将其用作键。你不能那样做。您必须自己单步执行字典键列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-05
      • 2017-07-11
      • 2016-03-16
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多