Удалить элементы из одного списка на основе содержимого другого - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь удалить все объекты из одного списка из другого.

Один из списков - это список .

В то время как другой - список кортежей .

ScoutNameList = [[('Rory', 'Adair')], [('Fiona', 'Adair')]]
ScoutNamedFromPatrol = [('Rory', 'Adair'), ('Fiona', 'Adair'), ('Ruariri', 'OBrien')]
ScoutNamedFromPatrol.remove(ScoutNameList)

Ожидаемый результат

ScoutNamedFromPatrol=[('Ruariri', 'OBrien')]

Фактический результат

ScoutNamed=[('Rory', 'Adair'), ('Fiona', 'Adair'), ('Ruariri', 'OBrien')]

Ответы [ 5 ]

0 голосов
/ 11 января 2019

Если порядок не важен, вы можете использовать set.difference или его синтаксический сахар -. Поскольку ScoutNameList является вложенным, с каждым подсписком, содержащим один элемент, вы можете использовать operator.itemgetter с map для построения итерируемой скаляры.

from operator import itemgetter

res = list(set(ScoutNamedFromPatrol) - set(map(itemgetter(0), ScoutNameList)))
# [('Ruariri', 'OBrien')]

Менее функциональная альтернатива, предложенная @TrebuchetMS:

res = list(set(ScoutNamedFromPatrol) - set(x[0] for x in ScoutNameList))

Более адаптируемая версия может работать с несколькими элементами в внутренних списках ScoutNameList:

from itertools import chain
res = list(set(ScoutNamedFromPatrol) - set(chain.from_iterable(ScoutNameList)))
0 голосов
/ 11 января 2019

Вы можете использовать понимание списка. Однако учтите, что вам нужно сгладить ScoutNameList, вы можете сделать это с помощью itertools.chain:

[i for i in ScoutNamedFromPatrol if i not in chain(*ScoutNameList)]
#[('Ruariri', 'OBrien')]

Где:

list(chain(*ScoutNameList))
#[('Rory', 'Adair'), ('Fiona', 'Adair')]
0 голосов
/ 11 января 2019
>>> for l in ScoutNameList:
    ScoutNamedFromPatrol.remove(l[0])
>>> ScoutNamedFromPatrol
[('Ruariri', 'OBrien')]
0 голосов
/ 11 января 2019

попробуйте

ScoutNameList = [[('Rory', 'Adair')], [('Fiona', 'Adair')]]
ScoutNamedFromPatrol = [('Rory', 'Adair'), ('Fiona', 'Adair'), ('Ruariri', 'OBrien')]
for x in ScoutNameList:
    for y in x:
        if y in ScoutNamedFromPatrol:

            ScoutNamedFromPatrol.remove(y)

print(ScoutNamedFromPatrol)
0 голосов
/ 11 января 2019

Вы можете использовать списочные выражения -

ScoutNamedFromPatrol = [s for s in ScoutNamedFromPatrol if [s] not in ScoutNameList]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...