Python:从对象列表中删除几乎重复的对象

时间:2018-11-03 02:33:29

标签: python list duplicates tuples

如何删除下面的元组列表中的所有元组,其中只有一个特定索引永远不会重复?在这种情况下,我需要删除每个元组的第二个值(也称为索引1)的重复项。

[(1051,97),(1051,132),(1048,132),(1048,283),(1048,438)]
                 ^^^        ^^^

所需的输出:

[(1051,97),(1051,132),(1048,283),(1048,438)]

能够保留上述所需输出中显示的一阶优先级的奖励点。

4 个答案:

答案 0 :(得分:0)

您可以维护在迭代过程中遇到的所有索引1元素的集合,并且如果未遇到其索引1元素,则仅在最终结果中包含元组:

lst = [(1051,97),(1051,132),(1048,132),(1048,283),(1048,438)]

s = set()
res = []
for i, j in lst:
    if j not in s:
        s.add(j)
        res.append((i,j))

print(res)
# [(1051, 97), (1051, 132), (1048, 283), (1048, 438)]

答案 1 :(得分:0)

lst = [(1051,97),(1051,132),(1048,132),(1048,283),(1048,438)]
lst = list(reversed([(v, k) for k, v in {t[1]: t[0] for t in reversed(lst)}.items()]))
print(lst)
# [(1051, 97), (1051, 132), (1048, 283), (1048, 438)]

答案 2 :(得分:0)

使用pandas

df = pd.DataFrame(l)
df.loc[df[1].drop_duplicates().index].values.tolist()

答案 3 :(得分:0)

建立反向字典。由于字典键始终是唯一的,因此重复符自然会被消除:

l = [(1051,97),(1051,132),(1048,132),(1048,283),(1048,438)]
[(x,y) for y,x in {y:x for x,y in l}.items()]
#[(1051, 97), (1048, 132), (1048, 283), (1048, 438)]

此解决方案不保留订单。