Удалить элементы из 2D-списка на основе 1D-списка - PullRequest
3 голосов
/ 18 марта 2019

У меня 2 списка

Список A (называемый a): 2D-список, подобный этому: [[1, 'aaa'], [2, 'bbb'], [3, 'ccc'], [4, 'ddd']]

Список B (называется b): 1D список, подобный этому: ['aaa', 'abc', 'cba', 'acb']

Я хочу удалить элементы из списка A на основе содержимого списка B. В примере ожидаемый результат:

Новый список C (называется c): [[2, 'bbb'], [3, 'ccc'], [4, 'ddd']] // Так как нет элемента 'bbb', 'ccc' или «DDD» в списке B

В настоящее время я использую следующий код и считаю его очень медленным:

c = []
for elem in a:
    if elem[1] not in b:
        c.append(elem)

Есть ли лучший способ сделать это удаление? Лучше ли создавать новый список и добавлять элементы или удалять элементы из оригинального списка?

Спасибо за помощь!

1 Ответ

4 голосов
/ 18 марта 2019

Не намного быстрее, но, возможно, более чисто, используя понимание списка

c = [elem for elem in a if elem[1] not in b]

Если b очень велико, то преобразование в набор значительно ускорит поиск, поскольку поиск в спискахв линейном времени O(n), но поиск в наборах происходит в постоянном времени O(1)

b_set = set(b)
c = [elem for elem in a if elem[1] not in b_set]

Если элементы index-1 a ('aaa', 'bbb', и т. д.) уникальны, тогда это может быть даже быстрее, потому что тогда мы можем использовать оператор разности множеств -

a_dict = {k: v for v, k in a}
b_set = set(b)

set_difference = a_dict.keys() - b_set
c = [(a_dict[k]: k) for k in set_difference]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...