удалить два последовательных элемента из списка python - PullRequest
0 голосов
/ 27 февраля 2019

Существует проблема с удалением последовательных элементов из списка.Например, у меня есть список;

['aaaaa', '@someword', '@otherword','bbbb',...]

Я хочу удалить из списка элементы с @ char.

a = ['aaaaa', '@someword', '@otherword','bbbb']
for word in a:
    if '@' in word:
        print("found @ in word :" +word)
        a.remove(word)

Выход есть;(найден только первый элемент, пропущен второй.)

found @ in word :@someword

, если я добавлю некоторое значение между этим элементом;

a = ['aaaaa', '@someword', 'qqqq', '@otherword','bbbb']

Он поймал двух из них;

found @ in word :@someword
found @ in word :@otherword

Я отлаживаю код, если есть последовательные слова, включающие @ char, функция удаления пропускает второе из-за изменения индексов после удаления процесса.

как я могу удалить эти слова?

Ответы [ 6 ]

0 голосов
/ 27 февраля 2019

Реальная проблема здесь в том, что вы просматриваете список, который редактируете (удаляете / добавляете элементы).Это означает, что когда вы удаляете элемент 2, когда вы работаете со вторым элементом, вы достигнете элемента 4 на следующей итерации.

Решения заключаются в том, чтобы перебрать копию списка или создать копию.списка и верните его (например, с пониманием списка)

Копия списка может быть создана с помощью word[:].

a = ['aaaaa', '@someword', '@otherword','bbbb']
for word in a[:]:
    if '@' in word:
        print("found @ in word :" +word)
        a.remove(word)
0 голосов
/ 27 февраля 2019

Не рекомендуется мутировать элемент списка, пока вы зацикливаетесь на нем.

a = ['aaaaa', '@someword', '@otherword','bbbb'] 
for index,word in enumerate(a):
    print(index, word)
    if '@' in word:
        a.remove(word)
        print(a)

Вывод этого

(0, 'aaaaa')
(1, '@someword')
['aaaaa', '@otherword', 'bbbb']
(2, 'bbbb')

Из этого вы можете видеть, что«@someword» удален, и элемент в индексе 2 больше не является «@otherword», теперь он «bbbb».Поэтому «@otherword» не может быть удалено.

Второй приведенный вами пример работает, поскольку при удалении «@someword» элемент с индексом 2 становится «@otherword», поэтому его можно удалить на следующей итерации.

(0, 'aaaaa')
(1, '@someword')
['aaaaa', 'qqqq', '@otherword', 'bbbb']
(2, '@otherword')
['aaaaa', 'qqqq', 'bbbb']

Я посоветую вам создать новый список и просто сохранить в нем элементы, не содержащие '@'

a = ['aaaaa', '@someword', 'qqqq', '@otherword','bbbb']
new_list = [i for i in a if '@' not in i]
print(new_list) # ['aaaaa', 'qqqq', 'bbbb']
0 голосов
/ 27 февраля 2019
word = ['aaaaa', '@someword', '@otherword','bbbb']    
filtered = list(filter( lambda x : '@' not in x ,word))

другой способ - пользовательский фильтр

.
0 голосов
/ 27 февраля 2019

вам нужно добавить список «а» в список.Приведенный ниже код может помочь вам

a = ['aaaaa', '@someword', '@otherword','bbbb']
for word in list(a):
    if '@' in word:
        print("found @ in word :" +word)
        a.remove(word)
0 голосов
/ 27 февраля 2019

Вы никогда не должны изменять список, через который вы перебираете файлы, а создавать новый:

b = [word for word in a if not '@' in word]
0 голосов
/ 27 февраля 2019

Вы можете использовать понимание списка, чтобы отфильтровать элементы на основе условия:

>>> original = ['aaaaa', '@someword', '@otherword','bbbb']
>>> filtered = [item for item in original if '@' not in item]
>>> filtered
['aaaaa', 'bbbb']

Или заменить их:

>>> replaced = [item if '@' not in item else '' for item in original]
>>> replaced
['aaaaa', '', '', 'bbbb']

Подробнее см. документацию Информация.Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...