代码之家  ›  专栏  ›  技术社区  ›  ababuji

删除列表中存在的重复整数列表,而不考虑整数列表的顺序

  •  4
  • ababuji  · 技术社区  · 7 年前
    l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]
    

    我的案子 [1, 2, -1] 被认为等于 [2, 1, -1] [1, -1, 2] . 本质上,排序并不重要。

    [1, 2, -1] = [2, 1, -1] = [1, -1, 2]
    

    在上面这样的情况下,我只需要保留这3个中的1个(这三个中的任何一个都可以)。

    因此,删除重复项后,列表现在必须 l1 = [[1, 2, -1], [1, 0, 1]] l1 = [[2, 1, -1], [1, 0, 1]] l1 = [[1, -1, 2], [1, 0, 1]]

    我试过对单个列表进行排序(但这会使我失去看到三元组的顺序),并将每个列表放入字典中。( TypeError: unhashable type: 'list' )

    注:

    当我说“不考虑整数列表的顺序”时,我的意思是,如果我的列表中有三个具有相同整数的列表,则顺序不同?这三个列表被认为是相同的!您可以从这3个列表中删除2个,但保留未移动列表的顺序,

    我举了一个例子,说明在我的列表中 l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]] , [[-1, 1, 2], [0, 1, 1]] 不可接受,因为 [-1, 1, 2] 在原始数组中不存在于该确切序列中! [-1, 1, 2] = [1, 2, -1] = [2, 1, -1] = [1, -1, 2] 是真的!如果我的列表中有这4个元素。但是,我的列表中没有[-1,1,2]项!

    同样重要的是:

    我可能在整数列表中有重复的元素。

    l1 = [[1, 0, 0], [0, 1, 0], [-1, 0, 1]]
    

    在这里: [1, 0, 0] = [0, 1, 0] ,当返回输出时,我需要删除其中一个。

    我要强调的是 2 这些单独列表中的0(我认为这也是重要的细节)。

    3 回复  |  直到 7 年前
        1
  •  1
  •   jpp    7 年前

    这是一个使用第三方的解决方案 toolz 图书馆。注释 compose unique 如果您没有访问库的权限,那么食谱是懒惰的,并且很容易从各自的源代码中提取。

    注意,我们对每个子列表进行排序,然后转换为不可变的 tuple . 这允许 独特的 形成和跟踪 set 用于o(1)查找的值。

    from toolz import unique, compose
    
    l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]
    
    res = list(unique(l1, key=compose(tuple, sorted)))
    
    print(res)
    
    [[1, 2, -1], [1, 0, 1]]
    

    源代码: toolz.compose , toolz.unique

        2
  •  2
  •   Rakesh    7 年前

    您可以使用对列表进行排序 sorted 然后检查并附加到结果。

    前任:

    l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]
    checkVal = []
    r = []
    for i in l1:
        val = sorted(i)
        if val not in checkVal:
            checkVal.append(val)
            r.append(i)
    print(r)
    

    输出:

    [[1, 2, -1], [1, 0, 1]]
    
        3
  •  1
  •   Kal    7 年前

    您也可以在不使用任何第三方库的情况下实现相同的效果:

    l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]
    seen = set()
    
    out = []
    for l in l1:
        t = tuple(sorted(l))
        if t in seen:
            continue
        seen.add(t)
        out.append(l)
    
    print(out)