【问题标题】:Replace duplicates in a list column替换列表列中的重复项
【发布时间】:2019-06-06 21:09:22
【问题描述】:

我有一个列表,在一个(最后一个)列中是一串逗号分隔的项目:

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']

现在我想删除该列中的重复项。

我试图从每一列中列出一个列表:

    e = [s.split(',') for s in temp]
    print e

这给了我:

[['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF', 'FFF', 'EE']]

现在我尝试删除重复项:

    y = list(set(e))
    print y

什么导致了错误

TypeError: unhashable type: 'list'

我将不胜感激。

编辑

我没有准确地说最终结果应该是什么。列表应该是这样的

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']

应该只删除最后一列中的重复项。

【问题讨论】:

  • 你需要e = [list(set(x) for x in e]

标签: python string python-2.7 list


【解决方案1】:

set 应用于列表的元素,而不是列表的列表。您希望您的 set 包含每个列表的字符串,而不是列表。

e = [list(set(x)) for x in e]

你也可以直接做:

e = [list(set(s.split(','))) for s in temp]

>>> e
[['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF']]

您可能需要sorted(set(s.split(','))) 来确保字典顺序(集合没有排序,even in python 3.7

对于一个扁平的有序列表,创建一个扁平集理解并对其进行排序:

e = sorted({x for s in temp for x in s.split(',')})

结果:

['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']

【讨论】:

  • 实际上根本不需要列表中的列表。有没有办法应用集合并删除列表中没有列表的重复项?
【解决方案2】:

这是使用itertools.chain 方法的解决方案

import itertools

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']
y = list(set(itertools.chain(*[s.split(',') for s in temp])))
# ['EE', 'FFF', 'AAA', 'BBB', 'CCC-DDD']

【讨论】:

    【解决方案3】:
     a = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']
     b = [s.split(',') for s in a]
     c = []
     for i in b:
         c = c + i
     c = list(set(c))
    
     ['EE', 'FFF', 'AAA', 'BBB', 'CCC-DDD']
    

    【讨论】:

      【解决方案4】:

      这是在 Python 中执行此操作的纯函数式方法:

      from functools import partial
      
      split = partial(str.split, sep=',')
      
      list(map(list, map(set, (map(split, temp)))))
      [['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF']]
      

      或者如我所见,答案不需要列表中的列表:

      from itertools import chain
      
      list(chain(*map(set, (map(split, temp)))))
      ['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-20
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        • 2021-11-29
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        相关资源
        最近更新 更多