如何删除列表中的部分重复项

时间:2018-10-11 19:28:50

标签: python

我有一个看起来像列表的列表

[[1,'a',2],[1,'b',2],[1,'a',3]]

如果列表列表中的第二个元素相同(例如,它们都是a),我想从列表中删除该项目

我想创建如下输出:

[[1,'a',2],[1,'b',2]]

它在重复项列表中捕获第一个。

3 个答案:

答案 0 :(得分:3)

这是How do you remove duplicates from a list whilst preserving order?的变体。

您可以使用标记集来跟踪已经附加的子列表,因为字符串是不可变的,因此可以在set中进行散列和存储:

lst = [[1,'a',2],[1,'b',2],[1,'a',3]]

marker_set = set()

result = []

for sublist in lst:
    second_elt = sublist[1]
    if second_elt not in marker_set:
        result.append(sublist)
        marker_set.add(second_elt)

print(result)

打印:

[[1, 'a', 2], [1, 'b', 2]]

(使用标记 set 而不是 list 允许平均O(1)查找,而不是O(N)

答案 1 :(得分:2)

您可以使用字典,其中第二个元素是键,位于列表的反面,以删除重复项:

dct = {j: (i, k) for i, j, k in reversed(L)}

{'a': (1, 2), 'b': (1, 2)}

以列表的形式返回结果:

[[i, j, k] for j, (i, k) in dct.items()]

[[1, 'a', 2], [1, 'b', 2]]

尽管此解决方案将始终保留第一次出现的重复项,但不能保证最终结果中元素的相对顺序。

答案 2 :(得分:1)

lst = [[1,'a',2],[1,'b',2],[1,'a',3]]
res = []
for i in lst:
    if not any(i[1] in j for j in res):
        res.append(i)

print(res)
# [[1, 'a', 2], [1, 'b', 2]]