【问题标题】:Get the parent key if a value is in the nested list (dict_values)如果值在嵌套列表中,则获取父键 (dict_values)
【发布时间】:2020-04-15 17:26:33
【问题描述】:

我有一本像这样的字典:

{'7D': {'category': 'C', 'directory': 'C', 'name': 'Co'},
 '37': {'category': 'C', 'directory': 'C', 'name': 'FI'},
 'AA': {'category': 'F', 'directory': 'F', 'name': 'Le'},
 '80': {'category': 'Cl', 'directory': 'F', 'name': 'AV'},
 'F7': {'category': 'Cl', 'directory': 'F', 'name': 'AG'}}

如果lookup_value = 'Co',我想获得7D。我试过这两种方法:

lookup_value = 'Co'
for name, val in groups.items():
    if val == lookup_value:
        print(name)

还有这个:

print(list(groups.keys().[list(groups.values()).index(lookup_value)])

第二个返回:

 ValueError: 'Co' is not in list

编辑:

我很抱歉这个混乱,我认为初始字典没有嵌套字典。事实证明,这是一个列表,可以从以下方面观察到:

bbb = groups.values()
type(bbb)

返回dict_values。事实证明这是一个列表,如下面的 Daniel F 所说!

【问题讨论】:

  • 你应该命名你的变量
  • for 循环中?你能详细说明一下吗?
  • 我的意思是你最初的字典,但从上下文来看,我猜你叫它groups
  • 也许你会感兴趣github.com/akesterson/dpath-python#filtering(但它是一个完整的库,只是为了那个小任务)。
  • type(groups.values()) 与您的值的实际类型无关,因此您的更新是无稽之谈。尝试 `[type(v) for v in groups.values()]

标签: python python-3.x dictionary for-loop if-statement


【解决方案1】:

一般来说,字典用于单向查找。如果您发现自己经常进行反向查找,则可能值得创建和维护一个反向字典:

groups = {...}
names = {v['name']: k for k, v in groups.items()}

现在就像访问一样简单

names['Co']

如果您真的只想要一个查找而不创建反向字典,请将next 与生成器一起使用:

next(k for k, v in groups.items() if v['name'] == 'Co')

【讨论】:

  • 两个选项都收到了TypeError: 'Group' object is not subscriptable。这是意外吗?
  • @AK88。这只是意味着您的初始对象不是字典
  • 我运行了这个type(groups) 并得到了dict。不是字典吗?
  • TypeError: 'Group' object is not subscriptable 表示您有一个Group 对象,而不是str。如果没有看到更多信息,我无法为您解决这个问题。
  • 我很抱歉造成这种混乱,现在正在调查。
【解决方案2】:

我想解释为什么您的第一种方法不能按预期工作并提供最小更改的修复。 你的 groups 是 dict,键是 strs,值是 dicts,因此在你的 for 循环中:

for name, val in groups.items():

valdict 例如:{'category': 'C', 'directory': 'C', 'name': 'Co'} 并询问 python 关于 strdict 之间的相等性 (==) 导致响应:否。正确的问题:'Co' 在 @987654332 内@的价值观?更改后,您的代码将正常工作:

lookup_value = 'Co'
for name, val in groups.items():
    if lookup_value in val.values():
        print(name)

输出:

7D

【讨论】:

  • 我不知道为什么,但我收到了这个错误:AttributeError: 'Group' object has no attribute 'values'
  • @AK88 显然你的groups 变量是Group 对象(不管是什么)而不是dict。您的真实代码与您在问题中发布的代码不同吗?但是阅读您的其他评论,显然不是Group 类型的groups 变量,而是组项目的值。 --> 所以groups 是一个字典,但groups 中的内容不是dicts。键后面的东西,那些似乎不是dicts
  • 是的,确实如此。但是pythonic类型是dict。所以我以为这是一本字典……奇怪……
  • @DanielF,感谢您的帮助。我确实进一步研究了结构并得到了这个:bbb = groups.values(); type(bbb),它返回dict_values。这和字典有什么不同吗?
  • 尝试以下操作:groups = dict(groups),也许这会强制 Group 对象变为 dicts,同时保持整个外部结构(这不是一个干净的解决方案)。
猜你喜欢
  • 1970-01-01
  • 2018-04-20
  • 2022-07-12
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2021-11-03
  • 1970-01-01
相关资源
最近更新 更多