Допустим, у меня есть следующий список списков:

list1 = [[A,B],[C,D],[E, F]]
list2 = [A, B, F]

Я хочу, чтобы функция возвращала общий список по отношению к первому. Ожидаемый результат этого примера будет:

result = [[A,B],[],[F]]

Я уже пытался перебрать каждый элемент list1 и, сравнивая со списком list2, создать новый массив, добавляющий каждый элемент. Я знаю, как перебирать список списков, но я не нахожу способ создать список списков для «результата».

Списки не большие, около 5 элементов. Существует возможность повторения элементов, но порядок в списках, внутри всего списка, не важен.

4
edualvarado 21 Авг 2018 в 09:16

4 ответа

Лучший ответ

Это один из подходов. Используя list comprehension

Пример:

list1 = [["A","B"],["C","D"],["E", "F"]]
list2 = ["A", "B", "F"]

result = [[j for j in i if j in list2] for i in list1]
print(result)

Вывод:

[['A', 'B'], [], ['F']]
5
Rakesh 21 Авг 2018 в 06:21

С набором арифметики, чрезвычайно легко и быстро:

set2 = set(list2)
[list(set(e) & set2) for e in list1]

Если списки могут содержать неуникальные элементы, тогда ... давайте использовать счетчики!

from collections import Counter
counter2 = Counter(list2)
[list((Counter(e) & counter2).elements()) for e in list1]
6
Amadan 21 Авг 2018 в 06:33

Используйте set и intersection

In [18]: [list(set(item).intersection(list2)) for item in list1]
Out[18]: [['A', 'B'], [], ['F']]

Переберите список и найдите пересечение с базовым списком.

Или используйте list comprehension,

In [16]: [[i for i in item if i in list2]for item in list1]
Out[16]: [['A', 'B'], [], ['F']]
4
Rahul K P 21 Авг 2018 в 06:39
listA = [['A','B'],['C','D'],['E', 'F']]
listB = ['A', 'B', 'F']
listOut = []
for item in listA:
    temp = []
    for inner in item:
        for b in listB:
            if inner == b:
                temp.append(b)
    listOut.append(temp)


print(listOut)

Это делает то, о чем вы просили.

-2
vividpk21 21 Авг 2018 в 06:24
51942648