如何从两个列表中删除公共元素?
How do I remove common elements from two lists?
我有两个列表,例如下面的示例(实际上,a
更长),我想删除所有常见元素,在本例中是列表 punctuation
中给出的标点符号。
a = [['A', 'man,', 'view,', 'becomes', 'mankind', ';', 'mankind', 'member', 'comical', 'family', 'Intelligences', '.'],['Jeans', 'lengthen', 'legs', ',', 'hug', 'hips', ',', 'turn', 'heads', '.']]
punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"]
当顺序不重要时:
您可以对其进行 set()
操作,但首先您必须展平嵌套列表 a
(取自 Making a flat list out of list of lists in Python):
b = [item for sublist in a for item in sublist]
cleaned = list(set(b) - set(punctuation))
cleaned
是一个类似于 ['A', 'hug', 'heads', 'family', 'Intelligences', 'becomes', 'Jeans', 'lengthen', 'member', 'turn', 'mankind', 'view,', 'legs', 'man,', 'hips', 'comical']
的列表
当顺序很重要时:
简单的列表理解,可能比较慢
cleaned = [x for x in b if x not in punctuation]
cleaned
看起来像 ['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences', 'Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads']
您可以这样做,但列表顺序可能会改变。
[list(set(sublist)-set(punctuation)) for sublist in a]
使用集合,您可以删除标点符号条目,并将结果再次转换为列表。使用列表理解对列表中的每个子列表执行此操作。
如果保持顺序很重要,您可以这样做:
[[x for x in sublist if not (x in punctuation)] for sublist in a]
如果需要保留顺序,请制作一组单词以逐项删除和测试收容。
cleaned = [word for word in words if word not in blacklist]
你可以这样做:
>>> from itertools import chain
>>> filter(lambda e: e not in punctuation, chain(*a))
['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences', 'Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads']
或者,如果您想维护子列表结构:
>>> [filter(lambda e: e not in punctuation, sub) for sub in a]
[['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences'], ['Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads']]
我有两个列表,例如下面的示例(实际上,a
更长),我想删除所有常见元素,在本例中是列表 punctuation
中给出的标点符号。
a = [['A', 'man,', 'view,', 'becomes', 'mankind', ';', 'mankind', 'member', 'comical', 'family', 'Intelligences', '.'],['Jeans', 'lengthen', 'legs', ',', 'hug', 'hips', ',', 'turn', 'heads', '.']]
punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"]
当顺序不重要时:
您可以对其进行 set()
操作,但首先您必须展平嵌套列表 a
(取自 Making a flat list out of list of lists in Python):
b = [item for sublist in a for item in sublist]
cleaned = list(set(b) - set(punctuation))
cleaned
是一个类似于 ['A', 'hug', 'heads', 'family', 'Intelligences', 'becomes', 'Jeans', 'lengthen', 'member', 'turn', 'mankind', 'view,', 'legs', 'man,', 'hips', 'comical']
当顺序很重要时:
简单的列表理解,可能比较慢
cleaned = [x for x in b if x not in punctuation]
cleaned
看起来像 ['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences', 'Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads']
您可以这样做,但列表顺序可能会改变。
[list(set(sublist)-set(punctuation)) for sublist in a]
使用集合,您可以删除标点符号条目,并将结果再次转换为列表。使用列表理解对列表中的每个子列表执行此操作。
如果保持顺序很重要,您可以这样做:
[[x for x in sublist if not (x in punctuation)] for sublist in a]
如果需要保留顺序,请制作一组单词以逐项删除和测试收容。
cleaned = [word for word in words if word not in blacklist]
你可以这样做:
>>> from itertools import chain
>>> filter(lambda e: e not in punctuation, chain(*a))
['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences', 'Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads']
或者,如果您想维护子列表结构:
>>> [filter(lambda e: e not in punctuation, sub) for sub in a]
[['A', 'man,', 'view,', 'becomes', 'mankind', 'mankind', 'member', 'comical', 'family', 'Intelligences'], ['Jeans', 'lengthen', 'legs', 'hug', 'hips', 'turn', 'heads']]