#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)