Del часть списка в python с помощью цикла for

Я пытаюсь удалить некоторые слова из строкового списка слов.

list1= "abc dfc kmc jhh jkl".

Моя цель - убрать слова от 'dfc' до 'jhh'. Я новичок в Python, поэтому пробую кое-что с индексом из C#, но здесь они не работают.

Я пробую это:

index=0
for x in list1:
  if x=='dfc'
    currentindex=index
    for y in list1[currentindex:]
        if y!='jhh'
           break;
        del list1[currentindex]
        currentindex=index
  elif x=='jhh'
       break;

если list1 является строкой, как указано в вашем сообщении, ваш внешний цикл будет проходить через list1 символ за символом (x - это символ, поэтому никогда не будет соответствовать 3-символьной строке).

Jonas 29.05.2018 10:57

Кажется, вы указали строку для list1. Если это строка, используйте пакет re. re.sub () выполняет свою работу.

Spinor8 29.05.2018 10:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
76
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы можете сделать это

  test = list1.replace("dfc", "")

Не думайте, что вопрос заключается в этом. OP хочет заменить все слова между двумя словами, а не заменять экземпляры слова.

Jonas 29.05.2018 11:04
Ответ принят как подходящий

Сначала разделите строку на слова:

list1 = "abc dfc kmc jhh jkl"
words = list1.split(" ")

Затем перебирайте слова, пока не найдете совпадение:

start_match = "dfc"
start_index = 0
end_match = "jhh"
end_index = 0
for i in range(len(words)):
    if words[i] == start_match:
        start_index = i
    if words[i] == end_match:
        end_index = j
        break
print ' '.join(words[:start_index]+words[end_index+1:])

Примечание. В случае нескольких совпадений будет удалено наименьшее количество слов (выберите последнее start_match и первое end_match).

Спасибо, все работает нормально, мне просто нужно внести это в новый список.

Ivan Kozaliev 29.05.2018 12:04

list1= "abc dfc kmc jhh jkl".split() составляет list1 следующим образом:

['abc', 'dfc', 'kmc', 'jhh', 'jkl']

Теперь, если вы хотите удалить элемент списка, вы можете попробовать либо

list1.remove(item) #removes first occurrence of 'item' in list1

Или же

list1.pop(index) #removes item at 'index' in list1

Не думайте, что вопрос заключается в этом. OP хочет заменить все слова между двумя словами, а не заменять экземпляры слова.

Jonas 29.05.2018 11:07

Вместо длинного цикла for решает задачу простой фрагмент в Python:

words = ['abc', 'dfc', 'kmc', 'jhh', 'jkl']

del words[1:4]
print(words)

индексы начинаются с 0. Итак, вы хотите удалить индекс 1-3. Мы вводим 4 в срез, потому что Python останавливает -1 перед последним аргументом индекса (то есть в индексе 3). Намного проще, чем петля.

Вот ваш результат:

['abc', 'jkl']
>>> a = "abc dfc kmc jhh jkl"
>>> print(a.split("dfc")[0] + a.split("jhh")[1])
abc  jkl

Вы можете выполнить этот пример обработки с помощью лямбда:

b = lambda a,b,c : a.split(b)[0] + a.split(c)[1]
print(b(a, "dfc", "jhh"))

Создайте список слов, разделив строку

list1= "abc dfc kmc jhh jkl".split()

Затем выполните итерацию по списку, используя переменную флага, чтобы указать, следует ли удалить элемент из списка.

flag = False   
for x in list1:
    if x=='dfc':
        flag = True
    if x == 'jhh':
        list1.remove(x)
        flag = False
    if flag == True:
        list1.remove(x)

Есть несколько проблем с тем, что вы пробовали, в частности:

  1. list1 - это строка, а не список
  2. когда вы пишете list1[i], вы получаете символ с индексом i (ни слова)
  3. в вашем цикле for вы пытаетесь изменить строку, которую вы повторяете: это очень плохая идея.

Вот мое предложение однострочного стиля с использованием re.sub(), которое просто заменяет часть строки, совпадающую с заданным шаблоном регулярного выражения. Для вашей цели может быть достаточно:

import re

list1= "abc dfc kmc jhh jkl"
list1 = re.sub(r'dfc .* jhh ', "", list1)

print(list1)

Примечание: я сохранил идентификатор list1, даже если это строка.

Другие вопросы по теме