我想从一个列表(基础)的元素中创建一个列表,但仅考虑另一列表(其他)的元素。
基本列表为:
base = [['A', 'B'], ['B'], ['A', 'B', 'C', 'D', 'E'], ['B'], ['A', 'B', 'C'], ['A'], ['B', 'C'], ['A', 'B'], ['C', 'A', 'B'], ['A'], ['B', 'C']]
另一个列表是:
other = ['A', 'B']
预期结果是:
expected = [['A', 'B'], ['B'], ['A', 'B'], ['B'], ['A', 'B'], ['A'], ['B'], ['A', 'B'], ['A', 'B'], ['A'], ['B']]
是否有一种pythonic的方法?
答案 0 :(得分:1)
base = [['A', 'B'], ['B'], ['A', 'B', 'C', 'D', 'E'], ['B'], ['A', 'B', 'C'], ['A'], ['B', 'C'], ['A', 'B'], ['C', 'A', 'B'], ['A'], ['B', 'C']]
other = ['A', 'B']
expected = [[i for i in l if i in other] for l in base]
print(expected)
输出:
[['A', 'B'],
['B'],
['A', 'B'],
['B'],
['A', 'B'],
['A'],
['B'],
['A', 'B'],
['A', 'B'],
['A'],
['B']]
破门而入: expected = [[i for i in l if i in other] for l in base]
等同于:
expected = []
for l in base: # For every list in base
lst = [] # There will be a list in expected
for i in l: # For every element in l
if i in other: # If the element is in base
lst.append(i) # Append the element to the list that will go into expected
expected.append(lst) # Append lst to expected
答案 1 :(得分:1)
使用列表理解:
result = [[x for x in arr if x in other] for arr in base]
此处可以应用一种快速优化。此处可以使用Set数据结构存储other
进行O(1)查找。
因此,改进版本:
otherSet = set(other)
result = [[x for x in arr if x in otherSet] for arr in base]
答案 2 :(得分:0)
您可以使用map
和filter
:
list(map(lambda x: list(filter(lambda f: f in other, x)), base))
[['A', 'B'],
['B'],
['A', 'B'],
['B'],
['A', 'B'],
['A'],
['B'],
['A', 'B'],
['A', 'B'],
['A'],
['B']]