根据另一个列表的内容从一个列表中移除项目。

3

我正试图从另一个列表中删除所有实体。

其中一个列表是列表的列表

而另一个则是元组的列表

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个回答

2
>>> for l in ScoutNameList:
    ScoutNamedFromPatrol.remove(l[0])
>>> ScoutNamedFromPatrol
[('Ruariri', 'OBrien')]

1
你可以使用列表推导式 -
ScoutNamedFromPatrol = [s for s in ScoutNamedFromPatrol if [s] not in ScoutNameList]

答案中缺少 [] - 现在尝试一下。 - Mortz

1
你可以使用列表推导式。但是请注意,你需要展开ScoutNameList,你可以使用itertools.chain来实现:
[i for i in ScoutNamedFromPatrol if i not in chain(*ScoutNameList)]
#[('Ruariri', 'OBrien')]

在哪里:

list(chain(*ScoutNameList))
#[('Rory', 'Adair'), ('Fiona', 'Adair')]

1
如果顺序不重要,您可以使用set.difference或其语法糖-。由于ScoutNameList是嵌套的,每个子列表包含一个项目,因此您可以使用operator.itemgettermap构造标量的可迭代对象。
from operator import itemgetter

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

@TrebuchetMS 提出了一个不那么 functional 的替代方案:

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

试试这个

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接