将变量与字典中的第二级匹配

时间:2017-10-19 21:47:04

标签: python dictionary search

我正在尝试通过字典的第二级简化迭代。

我知道这适用于简单列表:

if new not in existing_list:
    dosomestuff

是否有机会为字典y执行类似的操作,其中每个条目都是这样的?

{'fields':
    {'ID': 123, 'name': 'test'},
 'otherfield': 'value'
}

我需要做的是将变量(我们称之为x)与每个y['fields']['ID']进行比较。目前我只是在迭代y,但我认为必须有一种更聪明的方法来找到匹配。

6 个答案:

答案 0 :(得分:1)

为什么不创建以ID作为密钥的字典?

d = {143:
         {‘name‘: ‘test'},
     545:
         {'name': 'another test'},
}

答案 1 :(得分:1)

你可以像列表那样创建你正在做的幻觉,但你必须遍历dict值。这是一种方法。

mydict = {'fields': {'id': 123, 'name': 'value'}, 'fields2': 'test'}

test_id = 123

if test_id in (level2['id'] for level2 in mydict.values()):
    print("success: value found")
else:
    print("The value does not exist")
# Output: success: value found

答案 2 :(得分:1)

要在1行中检测给定的inner_key是否有inner_value,请尝试:

my_dict= {'fields': {'ID': 123, 'name': 'test'},
          'otherfield': 'value'}

inner_key, inner_value = 'ID', 123

print(inner_value in [val.get(inner_key) for val in my_dict.values() if isinstance(val, dict)])
# True

请注意,如果inner_key不在内部字典中,则get()方法将使您免于崩溃;如果my_dict中不仅有isinstance()函数,则>>> t = symbols('t', positive=True) >>> s = symbols('s') >>> inverse_laplace_transform(1 - 9/(s + 2) + 5/(s+1) - 1/(s+1)**2, s, t) 函数。值()。

答案 3 :(得分:0)

我正在考虑使用列表理解来浏览字典并构建要查找的每个相关字段的列表,例如['fields']['ID'],然后使用您已经提到的if x in list。这很简单,易于阅读,可以通过最少的修改进行调整以涵盖不同的领域。

>>> MyDict = {}
>>> MyDict["entry1"] = {'fields':{'ID': 123, 'name': 'test'},'otherfield': 'value' }
>>> MyDict["entry2"] = {'fields':{'ID': 456, 'name': 'test2'},'otherfield': 'value2' }
>>> x = 123
>>> if x in [v['fields']['ID'] for v in MyDict.values()]:
...   print("found x")
...
found x
>>> x = 789
>>> if x in [v['fields']['ID'] for v in MyDict.values()]:
...   print("found x")
...
>>>

答案 4 :(得分:0)

'ID'是一个列表吗?怎么样:

dictionary = {'fields':
    {'ID': [123,456], 'name': 'test'},
    'otherfield': 'value'}
item = 789
if item != dictionary['fields']['ID']:
    print('Hurra!')

或者对不同的数据类型使用另一种比较方法。

如果你不知道你需要哪个第一级字段:

if item not in (dictionary[field]['ID'] for field in dictionary.keys()):
    print('Hurra!')

答案 5 :(得分:0)

其他人提供了一些不错的选择,所以我想我会列出一些你可能选择使用的不同的东西:

(重用用户的例子)

>>> MyDict = {}
>>> MyDict["entry1"] = {'fields':{'ID': 123, 'name': 'test'},'otherfield': 'value' }
>>> MyDict["entry2"] = {'fields':{'ID': 456, 'name': 'test2'},'otherfield': 'value2' }
>>> for v in map(lambda x: x['ID'], 
                 filter(lambda x: isinstance(x, dict) and 'ID' in x,
                        sum(map(lambda x:list(x.values()),
                                list(MyDict.values())), 
                            []))):
...     v
...
123
456

为了解释这一点,从最里面的函数向外移动:

  1. 最里面的地图创建N个条目的列表,其中N是数字     顶级字典中的项目和每个条目是值的列表     您在上面显示的dict格式的每个项目。因此,列表     列表。
  2. 将列表列表汇总到一个列表中
  3. 使用“ID”键
  4. 过滤掉dicts列表
  5. 仅从每个此类字典中获取“ID”值