【问题标题】:Look up data in a nested dictionary using a path of keys [duplicate]使用键路径在嵌套字典中查找数据[重复]
【发布时间】:2019-11-18 18:31:14
【问题描述】:

我正在尝试通过提供键的路径来查找嵌套 Python 字典中的数据。

例如,如果我的 dict 是

my_dict = {"key1": {"key2": 'my data'}}

我想通过提供路径'key1|key2'来访问my_dict['key1']['key2']

这是我尝试过的:

all_keys = "key1|key2"
keys = all_keys.split("|")
key_path = ""
for key in keys:
     key_path += '[\'' + key + '\']'
     #my_dict is a dictionary with other dictionaries within it
     returnval = my_dict + key_path

我收到错误消息:TypeError: unsupported operand type(s) for +: 'dict' and 'str'

【问题讨论】:

  • dict 是一个类型,不要这样调用你的变量,选择另一个名字
  • 问题不清楚。这里的预期输出是什么?请明确指定您想要的输入和输出
  • 认为你期待dict + key_path神奇地变成例如dict['key1'],这绝对不会发生。您可以创建和评估该字符串,但为什么不只是 dict[key]
  • @jonrsharpe:我想做一个接受 all_keys(使用管道运算符连接的键)并找到键值的函数,所以我没有直接使用 dict['key1']
  • 但是您似乎在尝试以一种无法正常工作的方式不必要地将该表达式构建为字符串。关键是您已经可以使用我上面显示的符号将字符串的值用作键。

标签: python


【解决方案1】:

您可以使用functools.reduce

from functools import reduce

nested = {"key1": {"key2": 'my data'}}

all_keys = "key1|key2"
key_path = all_keys.split("|")

data = reduce(lambda dct, key: dct[key], key_path, nested)
print(data)
# my data

【讨论】:

  • 难以置信。我只是想理解这个问题。你已经回答过了:)
  • @Thierry Lathuille 谢谢,这符合我的预期。
  • 密钥错误。与 lambda。替换 lambda dict.get。在这里回答:stackoverflow.com/a/66761659/2223689
【解决方案2】:

这是一个常见的初学者问题:将语言语法与数据混淆。您可以使用eval 函数系列来执行此操作,但是......不要这样做,因为它容易出现痛苦的错误。相反,遍历您的键列表:

local_val = my_dict   # whatever is at your top level
keys = [ , , ]  # Your list of keys, top-down order
for local_key in keys:
    local_val = local_val[key]

# On loop exit, local_val is the innermost value you referenced.

【讨论】:

    【解决方案3】:

    dict+'["hello"]["world"]' 会抛出错误。这不是访问 dict["hello"]["world"] 的方式。加号在 python 中不起作用,这就是您收到错误 unsupported operand type(s) for +: 'dict' and 'str'

    的原因

    Python 不知道如何添加字典和字符串!

    all_keys = "key1|key2" keys = all_keys.split("|") returnval=dict #keep the top level stored in returnval initially for key in keys: returnval=returnval[key] #go down one level print(returnval)

    另外,请不要将您的字典命名为“dict”。它也是一个类名,因此通常是不好的做法。试试 mydict,d 等。

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2015-10-15
      • 2011-02-01
      • 1970-01-01
      • 2015-10-27
      相关资源
      最近更新 更多