检查值是否存在于键值对列表中,如果不存在则从 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
因为 list1
和 list2
实际上不是 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}]
如果我使用 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
因为 list1
和 list2
实际上不是 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}]