удаление элементов с помощью двух списков

#python #list #dataframe

Вопрос:

У меня есть два списка, и я хочу удалить некоторые элементы из первого списка. Я не понимаю, почему мой код не работает. Мой ввод:

 l0=['Localisation level 2 AM', 'Rang', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3', 'Unnamed: 5', 'Unnamed: 6']
l1=['Localisation level 2 AM', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3']
 

Я пытаюсь это сделать, но «WP Level 2» все еще находится в первом списке l0:

 for e in l0:
   if e in l1:
      l0.remove(e)
print(l0)
['Rang', 'WP Level 2', 'Unnamed: 5', 'Unnamed: 6']
 

Комментарии:

1. l не определено, поэтому я предполагаю, что вы имеете в виду l0.remove(e) . Вы не должны изменять список во время итерации по нему

2. Да, я имею в виду l0.remove(e)

Ответ №1:

К вашему сведению, если порядок не имеет значения, вы можете использовать set для достижения желаемого:

 >>> set(l0).difference(l1)
{'Rang', 'Unnamed: 5', 'Unnamed: 6'}
 

Ответ №2:

Как уже говорили другие, изменять список во время итерации по нему — плохая идея.

Pythonic способ справиться с этим — создать новый список и назначить его обратно l0 :

 l0 = [item for item in l0 if not item in l1]
 

Ответ №3:

 l0=['Localisation level 2 AM', 'Rang', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3', 'Unnamed: 5', 'Unnamed: 6']
l1=['Localisation level 2 AM', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3']

# for e in l0:
#    if e in l1:
#       l0.remove(e)
# print(l0)

l2 = []
for x in l0:
    if x not in l1:
        l2.append(x)
l0 = l2
print(l0)
 

[‘Ranged’, ‘Безымянный: 5’, ‘Безымянный: 6’]

Ответ №4:

См. https://sopython.com/canon/95/removing-items-from-a-list-while-iterating-over-the-list /

Причина этого в том, что итератор не знает, что элемент списка был удален, и с радостью переходит к следующему элементу.

Лучшим решением было бы использовать понимание списка:

 l0 = [e for e in l0 if not e in l1]
print(l0)
 

или выполнить итерацию в обратном порядке:

 for e in reversed(l0):
        if e in l1:
            l0.remove(e)
 

или для перебора копии списка:

 for e in list(l0):
        if e in l1:
            l0.remove(e)
 

Ответ №5:

Скопируйте ваш список l0 в другую переменную. Вы удаляете элементы во время итерации по списку, так что это ваша проблема. Кроме того, l.remove должно выглядеть так l0.remove , потому l что не определено

 import copy
l0=['Localisation level 2 AM', 'Rang', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3', 'Unnamed: 5', 'Unnamed: 6']
l1=['Localisation level 2 AM', 'Localisation level 3 AM', 'WP Level 2', 'WP Level 3']

l00 = copy.copy(l0)
for e in l0:
    if e in l1:
        print(e)
        l00.remove(e)
print(l00)