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

我有一个 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
188955 次浏览

这里有一个方法:

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

也许沿着这些方向的函数就是你想要的:

 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

也许这会有所帮助:

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 entry in my_dictlist:
if entry[key] == value:
return entry
return {}


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

基于@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!

接下来的对我来说很有用。

    #!/usr/bin/env python
a = [{ 'main_color': 'red', 'second_color':'blue'},
{ 'main_color': 'yellow', 'second_color':'green'},
{ 'main_color': 'yellow', 'second_color':'blue'}]


found_event = next(
filter(
lambda x: x['main_color'] == 'red',
a
),
#return this dict when not found
dict(
name='red',
value='{}'
)
)


if found_event:
print(found_event)


$python  /tmp/x
{'main_color': 'red', 'second_color': 'blue'}

只是另一种方式来做观察所要求的:

 if not filter(lambda d: d['main_color'] == 'red', a):
print('Item does not exist')

filter会将列表过滤到 OP 正在测试的项目。然后,if条件提出问题,“如果该项不存在”,然后执行该块。

我认为检查键是否存在会更好一些,因为一些评论者在首选答案 在这里输入链接描述下面询问

因此,我会在行尾加上一个小的 if 子句:


input_key = 'main_color'
input_value = 'red'


if not any(_dict[input_key] == input_value for _dict in a if input_key in _dict):
print("not exist")


我不确定,如果错了,但我认为 OP 要求检查,如果键值对存在,如果没有键值对应该添加。

在这种情况下,我建议使用一个小函数:

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


b = None


c = [{'second_color': 'blue'},
{'second_color': 'green'}]


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




def in_dictlist(_key: str, _value :str, _dict_list = None):
if _dict_list is None:
# Initialize a new empty list
# Because Input is None
# And set the key value pair
_dict_list = [{_key: _value}]
return _dict_list


# Check for keys in list
for entry in _dict_list:
# check if key with value exists
if _key in entry and entry[_key] == _value:
# if the pair exits continue
continue
else:
# if not exists add the pair
entry[_key] = _value
return _dict_list




_a = in_dictlist("main_color", "red", a )
print(f"{_a=}")
_b = in_dictlist("main_color", "red", b )
print(f"{_b=}")
_c = in_dictlist("main_color", "red", c )
print(f"{_c=}")


产出:

_a=[{'main_color': 'red', 'second_color': 'blue'}, {'main_color': 'red', 'second_color': 'green'}, {'main_color': 'red', 'second_color': 'blue'}]
_b=[{'main_color': 'red'}]
_c=[{'main_color': 'red', 'second_color': 'blue'}, {'main_color': 'red'}, {'second_color': 'green', 'main_color': 'red'}, {'main_color': 'red'}]