【问题标题】:Python dictionary comprehension - unhashable type: dict [duplicate]Python字典理解-不可散列的类型:dict [重复]
【发布时间】:2021-11-21 03:08:47
【问题描述】:

我需要执行以下操作:

  • 遍历字典列表 [{},{}]
    • 调用一个转换函数来转换每个字典,它返回一个字典。
      • 这里的键和值不是静态的,而是数据框名称和数据框值。所以字典可能有一个或多个键值对。
    • 我需要将其存储在最终字典中

预期:预期数据将是字典:

{"key1":"val1", "key2":"val2", "key3":"val3"} # ... in actual, the key would be dataframe name, value would be dataframe value

简化用例:


dictname = [{"key1":"val1","key2":"val2"},{"key3":"value3"}] # input list of dictionary

def transform(each):
    return each # to oversimplify, this would be a dictionary with one or more keys with transformations.

final = {transform(each) for each in dictname}
final

在这个问题上查看了其他相关线程,无法弄清楚如何处理具体情况。谁能指导一下?e

【问题讨论】:

  • 必须transform 返回一个字典吗?为什么不只返回新值?密钥由输入确定。
  • 您的代码等同于{{...} for .. in ..},因此您有一个集合理解,您正试图将其放入其中。为什么不简单地{k: 'new_value' for k in dictname}?您需要参与该函数调用吗?
  • @timgeb - 是的,更新问题。
  • @user16798185 那么chainmap解决方案应该这样做

标签: python python-3.x


【解决方案1】:

这是更新问题的更新答案。我认为以下应该做你想要的:

dictname = [{"key1":"val1", "key2":"val2"}, {"key3":"val3"}]

def transform(each):
    return each

final = {k:v for d in dictname for k, v in transform(d).items()}

transform 函数将其中一个字典作为参数,并返回一个字典。所有对transform 的调用返回的字典被合并到顶级字典final

上面的例子将final定义为:

{'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}

在此示例中,transform 仅返回传递给它的 dict,但它可以返回您想要的任何 dict

【讨论】:

  • 很抱歉没有更新完整的详细信息,请您查看完整详细信息的更新问题。
  • @user16798185 好的,根据我对更新问题的理解,我发布了一个全新的答案。看看这是否符合您的要求。
【解决方案2】:

定义变换为

def transform(each):
    return <the new value>

然后使用

result = {k: transform(k) for k in dictname}

如果您无法更新transform,请使用

from collections import ChainMap
result = dict(ChainMap(*(transform(k) for k in dictname)))

【讨论】:

  • 很抱歉没有更新完整的详细信息,请您查看完整详细信息的更新问题。
【解决方案3】:

您的代码中有几处错误。

dict 理解如下:{key: value, for key, value in something that outputs two things}。在您的情况下,transform_each 输出一个字典。所以修复这个我们得到:

dictname = {"key1":"val1","key2":"val2"} # input dictionary
def transform(each):
    return {each: "new_value"}
final = {key: transform(each) for key, each in dictname.items()}
final  # {'key1': {'val1': 'new_value'}, 'key2': {'val2': 'new_value'}}

这不是你想要的。您只需要更改 dict 的值。这是第二个错误:你的函数必须输出一个值,而不是一个字典。否则,如所见,你得到了一个字典。您可以按如下方式修复它:

dictname = {"key1":"val1","key2":"val2"} # input dictionary

def transform(each):
    return "new_value"


final = {key: transform(each) for key,  each in dictname.items()}
final  # {'key1': 'new_value', 'key2': 'new_value'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2019-03-10
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多