如何删除其他列表i中与TTEM匹配的所有列表项?

2024-10-01 04:44:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何迭代list2并删除包含list1 items之一的所有items?

list1 = [6, 7, 8, 9]
list2=['0009', '0001', '0008', '0003', '0004', '0005', '0006', '0007']

结果是:

list2=[ '0001',  '0003', '0004', '0005']

我试着这样做:

list1 = [6, 7, 8, 9]
list2=['0009', '0001', '0008', '0003', '0004', '0005', '0006', '0007']


for ittem in list2:
    for digit in ittem:
        if digit in ittem:
            list2.remove(ittem)

print(list2)

对于列表2中的ittem: 对于ittem中的数字: 如果ittem中有数字: 列表2

result :ValueError: list.remove(x): x not in list

ps:我不想创建一个新的列表,我想删除它。。有什么想法吗?你知道吗


Tags: in列表forifitems数字resultremove
3条回答

尝试列表理解:

list1_set = set(list1)
list2[:] = [x for x in list2 if int(x) not in list1_set]
你应该避免从中间的列表中删除。它将给你多项式时间的复杂性,而且是有点棘手的得到正确的。当您在列表上进行迭代时,从列表中删除项目通常会导致您跳过项目,因为列表的大小会发生变化。但是,可以通过在序列上向后迭代来安全地执行此操作:

>>> list1 = [6, 7, 8, 9]
>>> list2=['0009', '0001', '0008', '0003', '0004', '0005', '0006', '0007']

然后简单地说:

>>> for i in reversed(range(len(list2))):
...     item = list2[i]
...     if any(int(c) in list1 for c in item):
...         del list2[i]
...
>>> list2
['0001', '0003', '0004', '0005']

但是,创建一个新的列表作为中间层并使用它更改原来的列表几乎总是更快、更高效、更直接的:

>>> list2[:] = [x for x in list2 if any(int(c) in list1 for c in x)]
>>> list2
['0009', '0008', '0006', '0007']

最后,如果要检查列表中的成员身份,请考虑改用set对象。检查一个项目是否在一个列表中是一个线性操作,而不是一个set的常数时间。你知道吗

如果所有list2项都是唯一的,则可以在反向迭代中删除它们:

for item in reversed(list2):
    for number in list1:
        if str(number) in item:
            list2.remove(item)
            break
print(list2)
#['0001', '0003', '0004', '0005']

相关问题 更多 >