【问题标题】:Check if value exists in a dictionary of dictionaries and get the key(s)?检查字典字典中是否存在值并获取键?
【发布时间】:2019-08-31 10:22:45
【问题描述】:

我有一本字典:

x = {'NIFTY': {11382018: 'NIFTY19SEPFUT', 13177346: 'NIFTY19OCTFUT', 12335874: 'NIFTY19NOVFUT'}}

字典里面还有很多其他的字典。

我要检查示例是否:

y = 11382018

存在于字典中,如果是,获取主key在本例中为NIFTY和上面key的值即'NIFTY19SEPFUT'

我可以通过以下方式做到这一点:

for key in x.keys():
    di = x[key]
    if y in di.keys():
       inst = key
       cont = di[y]

只是想知道是否有更好的方法。

我的想法是不必遍历整个字典大师keys

【问题讨论】:

  • 只有2层嵌套?
  • @RomanPerekhrest,是的,只有两个级别
  • 如何处理多个匹配项?如果这些不能发生,如果可能的话,我会选择一个不会发生的数据结构。这样做也会改变你的问题。
  • @UlrichEckhardt 不能发生多个匹配。试图弄清楚这将如何改变问题。我得到上面格式的数据,你会把它改成哪种结构?

标签: python dictionary


【解决方案1】:

检索两个感兴趣的值的更紧凑的方法是使用嵌套字典理解:

[(k, sv) for k,v in x.items() for sk,sv in v.items() if sk == y]
# [('NIFTY', 'NIFTY19SEPFUT')]

【讨论】:

    【解决方案2】:

    更紧凑的版本(通用):

    [(k, v[y]) for k, v in d.items() if y in v]
    

    或者:

    *next(((k, v[y]) for k, v in d.items() if y in v), 'not found')
    

    如果您可以保证仅在一个嵌套字典中找到该键。 (注意我这里用d作为字典,只是因为感觉更有意义)

    代码

    d = {'NIFTY': {11382018: 'NIFTY19SEPFUT', 13177346: 'NIFTY19OCTFUT', 12335874: 'NIFTY19NOVFUT'}}
    
    y = 11382018
    print([(k, v[y]) for k, v in d.items() if y in v])
    
    # or:
    # print(*next(((k, v[y]) for k, v in d.items() if y in v), 'not found'))
    

    【讨论】:

    • next 在这里是个好主意,尽管您可能想添加一个默认值
    【解决方案3】:

    直截了当(仅用于 2 级嵌套):

    x = {'NIFTY': {11382018: 'NIFTY19SEPFUT', 13177346: 'NIFTY19OCTFUT', 12335874: 'NIFTY19NOVFUT'}}
    search_key = 11382018
    parent_key, value = None, None
    
    for k, inner_d in x.items():
        if search_key in inner_d:
            parent_key, value = k, inner_d[search_key]
            break
    
    print(parent_key, value)   # NIFTY NIFTY19SEPFUT
    

    【讨论】:

      猜你喜欢
      • 2012-03-27
      • 2016-03-20
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多