首页 > 解决方案 > 元组列表按第一个索引删除重复项

问题描述

我很难对付这个。我有一个元组列表,但只对基于元组的第一项删除重复项感兴趣。

我需要通过仅查看元组中的第一项来从单个列表中删除重复项。

我需要比较唯一在 uniqueFound 中的重复项的列表,并且只保留那些不在 uniqueFound 中的唯一项,也只对元组的第一项感兴趣。不应考虑其他数字和值。这是我想出的,它仍然在不应该的时候将 N1 传递到最终列表。必须有一个更简单的方法来做到这一点?

#unique found
uniqueFound = [('N1', '20.3', 1, 58, 14),
         ('N2', '20.1', 1, 44, 14),
         ('N3', '21', 1, 23, 14),
         ('N1', '21', 1, 23, 14),
         ('N5', '33', 1, 34, 14)
         ]
unique = [('N0', '23', 2, 22, 1),
         ('N6', '33.1', 1, 25, 11),
         ('N3', '21', 1, 33, 12),
         ('N1', '44', 1, 2, 44),
         ('N7', '33.2', 4, 22, 12),
         ('N7', '3.2', 2, 21, 132)
         ]

#Remove duplicates
uniqueFound = dict((x[0], x) for x in uniqueFound).values()
unique = dict((x[0], x) for x in unique).values()

fmatches=[]
uniquefinal = []

for x in uniqueFound:
    for y in unique:
        if x[0] == y[0]:
            fmatches.append(y)
        else:
            continue
fmatches = dict((x[0], x) for x in fmatches).values()
for x in unique:
    for y in fmatches:
        if x[0] == y[0]:
            continue
        else:
            uniquefinal.append(x)
duplicatesrem = dict((x[0], x) for x in uniquefinal).values()
uniqueFinal = list(duplicatesrem)
print(uniqueFinal)

产生

[('N0', '23', 2, 22, 1), ('N6', '33.1', 1, 25, 11), ('N3', '21', 1, 33, 12), ('N1', '44', 1, 2, 44), ('N7', '3.2', 2, 21, 132)]

我要做什么(在独特的但不是在独特的发现):

[('N0', '23', 2, 22, 1), ('N6', '33.1', 1, 25, 11), ('N7', '3.2', 2, 21, 132)]

谢谢你的帮助。

标签: pythonpython-3.x

解决方案


uniqueFound = [('N1', '20.3', 1, 58, 14),
         ('N2', '20.1', 1, 44, 14),
         ('N3', '21', 1, 23, 14),
         ('N1', '21', 1, 23, 14),
         ('N5', '33', 1, 34, 14)
         ]
unique = [('N0', '23', 2, 22, 1),
         ('N6', '33.1', 1, 25, 11),
         ('N3', '21', 1, 33, 12),
         ('N1', '44', 1, 2, 44),
         ('N7', '33.2', 4, 22, 12),
         ('N7', '3.2', 2, 23, 1)
         ]

aux1 = set(e[0] for e in uniqueFound)
aux2 = set()
result = []
for e in unique:
    e0 = e[0]
    if e0 in aux1: continue
    if e0 in aux2: continue
    aux2.add(e0)
    result.append(e)
print(result)

aux1是一个包含来自 的“键”的辅助集uniqueFound

aux2是一个包含已使用“键”的辅助集

如果在or中找到“键” ( e0) ,则不执行任何操作。否则将“键”添加到结果中并将元素添加到结果中aux1aux2aux2


推荐阅读