【问题标题】:how to remove partial duplicates in a list of lists [duplicate]如何删除列表列表中的部分重复项[重复]
【发布时间】:2018-10-12 04:08:58
【问题描述】:

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

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

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

我想创建如下所示的输出:

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

它抓取重复列表中的第一个。

【问题讨论】:

    标签: python


    【解决方案1】:

    这是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)

    【讨论】:

    • 在普通列表中使用set 有什么好处
    • 当然,我是这么想的,我应该知道这是速度相关的,不知道是否有其他原因,干得好!
    • 谢谢。实际上这个问题是边缘重复,但我认为将其作为重复关闭并不足以让 OP 和其他人解决那个特定的问题。
    • 如果您有完全相同的副本,您可以分享链接
    • 实际上这是我发现的结果的一个轻微变体,如果我遇到一个,将链接
    【解决方案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]]
    

    虽然此解决方案始终保持第一次出现的重复,但最终结果中不保证元素的相对顺序。

    【讨论】:

    • 不是真的,但这意味着我的一个衬垫可以更短:P
    • 您可以在单行中使用reversed。这样做更好,因为它不会创建新列表。
    • @Jean-FrançoisFabre 但是还有 4 个字符,显然效率低得多;)
    • 值得注意的是,这种方法只能在 Python 3.7 及更高版本中按预期工作。否则,dct 可以是任意顺序。
    • 我刚刚注意到他说的是第二个元素,而不是前两个,我无论如何都需要更新我的答案
    【解决方案3】:
    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]]
    

    【讨论】:

    • 不要仅仅为了使用groupby而排序,效率低下
    • @Jean-FrançoisFabre 应该寻找不涉及重新排列原始列表的替代方案吗?
    • 是的;当要分组的项目是连续的时,groupby 真的很整洁。否则 sort 会扼杀乐趣,在 O(N) 这样做时引入无用的 O(N*log(N)) 复杂性
    • @Jean-FrançoisFabre 谢谢,所以保留 groupby 以供我们不必重新排列列表时使用,明白了
    • 这个解决方案会更慢,但可以在非可变项目上工作,所以是的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2019-12-07
    • 2011-10-04
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多