【问题标题】:If I have duplicates in a list with brackets, what should I do如果我在带括号的列表中有重复项,我该怎么办
【发布时间】:2019-02-01 12:42:46
【问题描述】:

假设我有以下列表:

 m=[1,2,[1],1,2,[1]]

我希望删除所有重复项。如果不是列表中的括号,那么我可以使用:

 m=list(set(m))

但是当我这样做时,我得到了错误:

不可散列的类型'set'。

什么命令可以帮助我删除重复项,这样我就只能留在列表中

 m=[1,2,[1]]

谢谢

【问题讨论】:

    标签: python-3.x list set brackets


    【解决方案1】:

    简单的解决方案,

    m=[1,2,[1],1,2,[1]]
    l= []
    for i in m:
        if i not in l:
            l.append(i)
    print(l)
    
    [1, 2, [1]]
    
    [Program finished] 
    

    【讨论】:

      【解决方案2】:
      结果 = [] 对于我在 m 中: 标志 = 真 对于 m 中的 j: 如果我 == j: 标志 = 假 如果标志: 结果.append(i)

      结果将是:[1,2,[1]]

      有一些方法可以使这段代码更短,但为了便于阅读,我写得更冗长。另外,请注意,这种方法是 O(n^2),所以我不推荐长列表。但好处是简单。

      【讨论】:

        【解决方案3】:

        对于更通用的解决方案,您可以使用pickle.dumps 序列化每个列表项,然后将它们传递给set(),然后使用pickle.loads 反序列化这些项目:

        import pickle
        m = list(map(pickle.loads, set(map(pickle.dumps, m))))
        

        如果您希望保持原始顺序,可以使用 dict(自 Python 3.6+ 起已成为有序)而不是 set:

        import pickle
        m = list(map(pickle.loads, {k: 1 for k in map(pickle.dumps, m)}))
        

        或者如果您需要兼容 Python 3.5 或更早版本,您可以改用collections.OrderedDict

        import pickle
        from collections import OrderedDict
        m = list(map(pickle.loads, OrderedDict((k, 1) for k in map(pickle.dumps, m))))
        

        【讨论】:

        • 不一定能维持秩序。
        • 对。我添加了一个维持秩序的解决方案。
        【解决方案4】:

        您可以按照以下方式做一些事情:

        m=[1,2,[1],1,2,[1]]
        seen=set()
        nm=[]
        for e in m:
            try:
                x={e}
                x=e
            except TypeError:
                x=frozenset(e)  
            if x not in seen:
                seen.add(x) 
                nm.append(e)
        >>> nm
        [1, 2, [1]]
        

        来自 cmets:此方法保留原始列表的顺序。如果您希望数字类型在前,其他类型在后,您可以这样做:

        sorted(nm, key=lambda e: 0 if isinstance(e, (int,float)) else 1)
        

        【讨论】:

        • 嗨@dawg,我已经使用了代码,但我有一个问题。如果我有 m=[1,[1],2,1,[1]] 并应用相同的确切代码,输出将是 [1, [1], 2]。有没有办法解决这个问题,使带括号的术语最后出现?
        【解决方案5】:

        第一步是将内部列表转换为元组:

        >> new_list = [tuple(i) if type(i) == list else i for i in m]
        

        然后创建一个删除重复的集合:

        >> no_duplicates = set(new_list)
        >> no_duplicates
        {1, 2, (1,)}
        

        如果您愿意,可以将其转换为列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-25
          • 1970-01-01
          • 1970-01-01
          • 2010-09-18
          • 2021-07-16
          • 1970-01-01
          • 2016-01-20
          • 1970-01-01
          相关资源
          最近更新 更多