我有一个列表,在最后一列中是一串用逗号分隔的项目:
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']
只需在最后一列中删除重复项即可。
答案 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']