替换列表列中的重复项

时间:2019-01-11 22:54:03

标签: python string python-2.7 list

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

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']

只需在最后一列中删除重复项即可。

4 个答案:

答案 0 :(得分:3)

在列表的元素上应用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']

答案 1 :(得分:0)

这是使用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']

答案 2 :(得分:0)

    Date        A       B
0   03/31/2018  $3.27   $51,042.00
1   06/30/2018  $5.07   $52,886.00
2   09/30/2018  $5.75   $56,576.00
3   12/31/2018  N/A     N/A

答案 3 :(得分:0)

这是在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']