WedX - журнал о программировании и компьютерных науках

удалить элементы из списка строк при обходе

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

list1 = ['', '$', '32,324', '$', '32', '$', '(35', ')', '$', '32,321']

я хочу удалить $ из списка, и если появится ) или )% или %, добавьте это к предыдущему элементу списка.
Ожидаемый результат:

['', '32,324', '32', '(35)', '32,321']

то, что я пробовал, это

for j,element in enumerate(list1):
   if element == '%' or element == ")%" or element ==')':
      list1[j-1] = list1[j-1] + element
      list1.pop(j)
   elif element == '$':
      list1.pop(j)

но результат, который я получаю,

['', '32,324', '32', '(35)', '$', '32,321']

это не ожидаемый результат. Пожалуйста помоги

Этот вопрос отличается от предлагаемой ссылки, здесь я должен выполнить конкатенацию с предыдущим элементом, если текущий элемент ), )% или %.

30.05.2019

  • Вероятно, вам будет проще скопировать элементы, которые вы хотите, в новый список, вместо того, чтобы пытаться фильтровать его И одновременно перемещаться по нему. 30.05.2019
  • Как насчет вывода ["(3", "$", ")"]? 30.05.2019
  • @LanteDellarovere, это также должно быть объединено с первым элементом, а последние два должны быть удалены, вывод: `[(3$)] 30.05.2019
  • Почему "$" включено в вывод? 30.05.2019
  • если ["(3$")] это результат, я думаю, вам следует переформулировать правила, потому что есть несоответствия 30.05.2019
  • Вопрос был приостановлен за несколько секунд до того, как я опубликовал свой ответ. Вот код, который работает без клонирования списка, проверьте его. 30.05.2019
  • @OlvinRoght Если вы считаете, что у вас есть решение, на которое еще не распространяется какой-либо ответ о дубликатах, вы должны опубликовать его там. Дубликаты предназначены для сбора всех ответов в одном месте, а не для предотвращения новых хороших ответов. 30.05.2019
  • вопрос не отличается. Проблема в том, что вы не можете использовать pop при переборе списка. 30.05.2019

Ответы:


1

То, что сказал Парень в Зеленом Плаще, в основном верно. Редактирование размера списка (путем вызова .pop()) приводит к тому, что вы получаете неожиданное значение j. Для меня самый простой способ решить эту проблему, сохранив при этом существующий код, — просто не изменять свой список, а вместо этого создать новый:

new_list = []
for j,element in enumerate(list1):
   if element == '%' or element == ")%" or element ==')':
      ret[len(ret) - 1] += element  # add at the end of the previous element
   elif element != '$':
      new_list.push(element)

Тем не менее, я бы посоветовал вам подумать о ваших крайних случаях здесь. Что происходит, когда за ')' следует другое ')' в вашем списке? Это может быть особым случаем в вашем операторе if. Надеюсь, это помогло!

30.05.2019
  • Хороший звонок о пограничных случаях. 30.05.2019

  • 2

    Вместо того, чтобы пытаться динамически удалять и объединять элементы во время итерации по списку, будет намного проще создать новый список на основе условий, описанных здесь.

    list1 = ['', '$', '32,324', '$', '32', '$', '(35', ')', '$', '32,321']
    
    out = []
    for element in list1:
        if element == "$":
            continue #skip if $ present
        elif element in ("%", ")", ")%"):
            out[-1] = out[-1] + element #merge with last element of out so far.
        else:
            out.append(element)
    
    print(out)
    #Output:
    ['', '32,324', '32', '(35)', '32,321']
    
    30.05.2019
  • if element in ("%", ")", ")%"): ... elif element != "$": ... должно быть достаточно. 30.05.2019

  • 3

    Я думаю, что это понимание списка работает (не видел пример того, как обрабатывается %):

    [ (a+b if b in (')',')%','%') else a) for a,b in zip(list1,list1[1:]+['']) if a not in ('$',')',')%','%')]
    

    Идея состоит в том, чтобы:

    • составить список пар элементов и их преемников
    • отфильтровать элементы, которые должны быть удалены
    • добавить преемника по мере необходимости к тем, которые мы сохраняем
    30.05.2019
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: wedx@cp9.ru