繁体   English   中英

替换列表列中的重复项

[英]Replace duplicates in a list column

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

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

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

对列表中不在列表列表上的元素应用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(',')))来确保字典顺序( 即使在python 3.7中也没有订购集合)

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

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

结果:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM