检查值是否已存在于字典列表中?


122

我有一个Python字典列表,如下所示:

a = [
    {'main_color': 'red', 'second_color':'blue'},
    {'main_color': 'yellow', 'second_color':'green'},
    {'main_color': 'yellow', 'second_color':'blue'},
]

我想检查列表中是否已存在具有特定键/值的字典,如下所示:

// is a dict with 'main_color'='red' in the list already?
// if not: add item

Answers:


268

这是一种实现方法:

if not any(d['main_color'] == 'red' for d in a):
    # does not exist

括号中的部分是一个生成器表达式,该表达式True将为每个具有您要查找的键-值对的字典返回,否则为False


如果密钥也可能丢失,则上面的代码可以给您一个KeyError。您可以使用get并提供默认值来解决此问题。如果不提供默认值,None则返回。

if not any(d.get('main_color', default_value) == 'red' for d in a):
    # does not exist

令人惊叹的单行语法,为此我一直都很努力!我很好奇,在显示给我们的Python文档中,我们实际上可以将“ for”的运算放在“ for”之前?
sylye,2017年

1
我找到了它,它叫做List Comprehensions docs.python.org/2/whatsnew/2.0.html?highlight=comprehensions
sylye

2
是否有可能测试'main_color': 'red'AND是否'second_color':'blue'存在?
佛罗伦萨

1
一旦表达式的计算结果为true或false,是否可以对值执行操作而不必再次循环?
布莱斯

当数据带有“ null” [{“ main_color”:null,“ second_color”:“ red”},{“ main_color:” green“,” second_color“:” null“}]时,它不起作用
Ashok Sri

5

也许这会有所帮助:

a = [{ 'main_color': 'red', 'second_color':'blue'},
     { 'main_color': 'yellow', 'second_color':'green'},
     { 'main_color': 'yellow', 'second_color':'blue'}]

def in_dictlist((key, value), my_dictlist):
    for this in my_dictlist:
        if this[key] == value:
            return this
    return {}

print in_dictlist(('main_color','red'), a)
print in_dictlist(('main_color','pink'), a)

3

遵循这些原则的功能也许就是您所追求的:

 def add_unique_to_dict_list(dict_list, key, value):
  for d in dict_list:
     if key in d:
        return d[key]

  dict_list.append({ key: value })
  return value

1

基于@Mark Byers的一个很好的答案,并紧接着@Florent问题,仅表明它也可以在具有超过2个键的dic列表中使用2个条件:

names = []
names.append({'first': 'Nil', 'last': 'Elliot', 'suffix': 'III'})
names.append({'first': 'Max', 'last': 'Sam', 'suffix': 'IX'})
names.append({'first': 'Anthony', 'last': 'Mark', 'suffix': 'IX'})

if not any(d['first'] == 'Anthony' and d['last'] == 'Mark' for d in names):

    print('Not exists!')
else:
    print('Exists!')

结果:

Exists!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.