【问题标题】:Python nested dictionary acces by specific subkey通过特定子键访问 Python 嵌套字典
【发布时间】:2020-08-18 15:32:01
【问题描述】:

我想知道以下字典的哪个键属于特定的子键:

dic = {'key1':{'subkey1':'entry1', 'name':'entry2'},
       'key2':{'subkey3':'entry3', 'name':'entry4'},
       'key3':{'subkey5':'entry5', 'name':'entry6'}}

例如:哪个键属于entry4?

for i in dic.keys():
    if dic[i]['name'] == 'entry4':
        print(i)
        break

答案是:key2

有没有更简单/更好的方法来做到这一点?

【问题讨论】:

  • [k for k, v in dic.items() if 'entry4' in v.values()] ?基本相同的逻辑,但更紧凑。
  • 如果您经常通过name 查找,您可能希望反转您的字典以由name 键入以进行 O(1) 查找。
  • next(i for i in dic if dic[i]['name'] == 'entry4')
  • @superbrain dic[i].get('name') 会更健壮。如果没有匹配,也许可以使用next 的默认参数。
  • @masterofpuppets 您能否确认您只想使用“名称”键搜索值?在这种情况下,其中一些答案是错误的!

标签: python dictionary nested


【解决方案1】:

试试这个

dic = {'key1':{'subkey1':'entry1', 'name':'entry2'},
       'key2':{'subkey3':'entry3', 'name':'entry4'},
       'key3':{'subkey5':'entry5', 'name':'entry6'}}

print(''.join(x for x, y in dic.items() if 'entry4' in y.values()))

输出

key2

【讨论】:

  • 这里使用''.join的原因是什么?
  • @Bill 只是将其从列表中删除
  • 一个 OP 想要唯一的词 key 2 而不是列表包含那个词
  • 危险是如果有重复你得到key2key3key4...。我认为@Samwise 在 cmets 中有最好的答案。返回一个列表,然后您就可以检测到重复项并处理它们。
  • 可以将分隔符改为' ''\n'
【解决方案2】:

正如@Samwise 在 cmets 中已经建议的那样:

[key for key, subdic in dic.items() if 'entry4' in subdic.values()] 

输出:

['key2']

注意:它返回一个列表,因为可能有多个匹配项。

如果您只关心第一个匹配项,或者您确定没有重复项,则可以使用:

matching_keys = [key for key, subdic in dic.items() if 'entry4' in subdic.values()]
matching_keys[0]

输出:

'key2'

【讨论】:

  • 这实际上是不正确的,因为 OP 只想搜索以 'name' 为键的值。
猜你喜欢
  • 2013-01-19
  • 2021-09-17
  • 2018-02-09
  • 2017-01-20
  • 2011-05-13
  • 2016-11-19
  • 1970-01-01
相关资源
最近更新 更多