检查值是否存在于键值对列表中,如果不存在则从 iterables 添加新的键值对值(不覆盖相同的键)

Checking if value is present in the list of key-value pairs, if not present then add the new key-pair value from iterables (not overwriting same key)

如果我使用 not in 它仍然会附加新的密钥对值,即使特定值已经在列表中也是如此。

    dict1 = {'a': 0, 'a': 5, 'b': 1, 'c': 2}
    list1 = [{'a': 0}] # This key-pair value is already in the list1 but 
                       # still added from dict1.

    new1 = []
    new2 = []
    for key, value in dict1.items():
        if value not in list1:
            new1.append(key)
            new2.append(value)

    new0 = {new1[i]: new2[i] for i in range(len(new1))}
    list1.append(new0)
    

期望的输出是:

    list1 = [{'a': 0, 'a': 5, 'b': 1, 'c': 2}]

(因为我不想覆盖 key/s)

由于您没有提供示例数据,因此我必须在这里进行一些猜测。如果我猜错了,请提供所需信息。

您在 list1 上致电 .items。列表没有 items 函数。相反,我怀疑你的 list1 实际上是一本字典,例如:

list1 = {
    "a":1, 
    "b":2,
    "c":3
}

在当前循环中,您检查值是否在 list2 范围内。如果 list2 实际上是一个列表,那么你这样做是正确的。但是,根据您的标题,我假设您真正想要做的是检查密钥是否在 list2 中,如果不在 key:value 中,则将 key:value 添加到 list2 中。您不能将 key:value 对添加到列表中,因此我假设 list2 也应该是字典。您可以将它们添加为元组,但根据标题,我认为这不是您想要的。

如果您真的想将它作为 key:value 对添加到字典中,您可以按如下方式进行:

list2 = {}
for key, value in list1.items():
    if key not in list2.keys(): # check if this key already exists
        list2[key] = value # if not, add they key with the value

因为 list1list2 实际上不是 list 的实例,而是 dict 的实例,我建议重命名变量以避免将来混淆。希望对您有所帮助!

在有问题的更新后编辑

您的示例数据有一个小错误,因为有两个 a 键,这意味着第一个 {'a':0} 已经在 dict1 中被覆盖。

dict1 = {'a': 0, 'b': 5, 'c': 1, 'd': 2}
list1 = [{'a': 0}] 

据我了解,您希望检查该值是否已包含在字典列表中。 因此,我们需要从这些字典中获取所有值。

由于您不想覆盖任何键,因此它需要是一个字典列表,每个字典只有一个键。因此,我们可以获得每个单独的字典,获取键。这 return 是一个 dict_keys object,我们可以将其转换为列表。由于 list1 中的每个字典总是只有一个键,我们可以从所述 lsit 中取出第一个键。

[list(x.values())[0] for x in list1]

将其放入我们得到的循环中

for key, value in dict1.items():
    if not value in [list(x.values())[0] for x in list1]:
    # If no dictionary exists within `list1` with this value
        list1.append({key:value}) # then add it as a new dictionary

这会 return

[{'a': 0}, {'b': 5}, {'c': 1}, {'d': 2}]

您可以使用不同的 dict1 再次 运行 此代码,并且它不会覆盖 list1 中的键,例如:

dict1 = {'a': 9}

输出会变成

[{'a': 0}, {'b': 5}, {'c': 1}, {'d': 2}, {'a': 9}]