仅考虑其他列表的元素来创建列表

时间:2020-07-07 19:09:35

标签: python list

我想从一个列表(基础)的元素中创建一个列表,但仅考虑另一列表(其他)的元素。

基本列表为:

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的方法?

3 个答案:

答案 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)

您可以使用mapfilter

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