元组列表按第一个索引删除重复项

2024-10-04 11:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我只需要查看元组中的第一项,就可以从各个列表中删除重复项

我需要比较uniqueFound中的unique的重复列表,只保留uniqueFound中没有的unique列表,也只对元组的第一项感兴趣。不应考虑其他数字和值。这是我想到的,它仍然将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)]

我想要什么(在unique中,但不是在uniqueFound中):

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

谢谢你的帮助


Tags: in列表fordict元组uniquevaluesn6
3条回答

另一个利用字典的解决方案:

found = {i[0] for i in uniqueFound}
dct = {k: v for k, *v in unique if k not in found}
[(k, *v) for k, v in dct.items()]
# [('N0', '23', 2, 22, 1), ('N6', '33.1', 1, 25, 11), ('N7', '3.2', 2, 23, 1)]
drop = {t[0] for t in uniqueFound} # set comprehension

# build a conditional list comprehension
uniqueFinal = [e for e in unique if e[0] not in drop]
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是一个辅助集,包含已使用的“键”

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

相关问题 更多 >