避免或消除 Python 字典中的重复/反向结果



在此处输入图像描述

我正在寻找 csv 中两列中的对。如果它找到 A-B 和 B-A,则在字典中只包含 A-B。我写了以下脚本:

dataset = list(zip(col1,col2))
for a,b in dataset:
    if (a,b) and (b,a) in dataset:
        dic [a] = b 

但显然我只需要一个,输出是:

{'A': 'B', 'C': 'B', 'B': 'A', 'D': 'C', 'F': 'C', 'H': 'C', 'J': 'X', 'X': 'J'}

如您所见,它有时会重复(例如,D:C 是正确的,但它只出现一次,我不知道为什么(

如何避免这些重复或从字典中删除"反向形式"?

尝试一个简单的添加:

if (a,b) and (b,a) in dataset 
    and a < b :

这只能让您获得两者之一。 它还假定(如示例中所示(没有行包含两次相同的值。

您不必在每个步骤中检查两个对。相反,您只需要检查b是否在字典中,如果是,是否dic[b] != a

这样做的原因是,我们总是将 from col1 添加为键,因此我们只需要查看是否已添加反向值。

col1 = ['A', 'C', 'B', 'D', 'X', 'F', 'H', 'J']
col2 = ['B', 'B', 'A', 'C', 'J', 'C', 'C', 'X']
dic = {}
for a, b in zip(col1, col2):
    if (b not in dic) or (dic[b] != a):
        dic[a] = b
#{'A': 'B', 'C': 'B', 'D': 'C', 'F': 'C', 'H': 'C', 'X': 'J'}

但是,如果您只想在两个版本都存在的情况下保留每对的一个副本,则需要一种稍微不同的方法。

首先创建一个包含所有常见对的字典。然后像以前一样迭代,并且仅在两个版本都存在时才添加。使用与上述相同的逻辑来避免重复。

d = dict(zip(col1, col2))
dic = {}
for a, b in d.items():
    if (a in d) and (b in d) and (d[a] == b) and (d[b] == a):
        if (b not in dic) or (dic[b] != a):
            dic[a] = b
#{'A': 'B', 'J': 'X'}

最新更新