如何在 Python 中签入数组中是否存在键:值(键:值)



我有一个键:值对数组,我使用文档内容(实体提取(的循环生成。

entity_array.append({
"key": entity.label_,
"value": entity.text
})

我想添加一个检查,如果值键已经存在,请不要附加,但不确定如何使用键和值。原因是我收到了很多重复的行。

我能够检查键 OR 值是否存在,但这并没有给出所需的结果,因为一个实体可能属于多个键。

任何帮助表示赞赏。

听起来您使用的数据结构给您带来了一些问题。 如果要跟踪entity.label_值和entity.text值的重复组合,请考虑将该组合视为namedtuple并使用set快速检查重复项:

import collections
Entity = collections.namedtuple("Entity", ["key", "value"])  # a tuple called "Entity" with named elements
entity_set = set()  # empty set where we will store deduplicated combinations of label and text
for entity in your_iterable_here:
entity_set.add(Entity(key=entity.label_, value=entity.text))  # add to the set if it's not there already, otherwise do nothing

如果需要,您甚至可以将其作为单行代码执行此操作:

entity_set = set(Entity(key=entity.label_, value=entity.text) for entity in your_iterable_here)

完成后,您将在entity_set中拥有一组唯一的键/值对。 如果你绝对需要 OP(字典列表(中提到的数据结构中的实体,一种选择是利用 namedtuple._asdict(( 函数(尽管名称中有下划线,但它是一个完整记录的函数,也是"公共"命名元组接口的一部分(:

entity_array = [entity._asdict() for entity in entity_set]

此解决方案有两个注意事项:

  1. 无论entity._labelentity.text是什么,它们都必须是可哈希的才能放入set中。 如果您存储的内容不是字符串等简单值,则有很多方法可以解决此问题,但它可能会变得复杂。
  2. 不会保留your_iterable_here生成的实体的顺序。 有简单的方法可以解决这个问题,比如使用带有Entity键和bool值而不是集合的 OrderedDict。

你可以为此实现你自己的函数,例如你可以用给定的键调用get方法,并将返回值与你的观察值进行比较:

def exists(dict_:dict, key:str, value:object) -> bool:
return dict_.get(key) == value

您必须检查两个条件 - (a( 如果键在目标字典中不存在,以及 (b( 如果键存在但值不同。在这两种情况下,您都必须将新值添加到字典中。

例如,假设 dict{} 是你的主字典,下面的values_to_add是一个新字典,其中包含一些需要添加到 dict{} 的值。下面的代码执行您要执行的操作:

from itertools import combinations
from datetime import timedelta
import datetime
import pandas as pd
import numpy as np
import random as rd
dict = {
"Key_1": "Value_1",
"Key_2": "Value_2",
"Key_3": "Value_3"
}
values_to_add = {
"Key_1": "Value_X",
"Key_4": "Value_4"
}
for key,value in values_to_add.items():
if key in dict and dict[key] != value:
dict[key]=value
if not key in dict:
dict[key] = value
dict

相关内容

最新更新