Удаление «подсписка» из списка
Нужно удалить из списка в вхождения, да не просто по элементам, а прям множество. Т.е. если есть список: [0, 1, 2, 3, 1, 5, 3, 7] , и например, кортеж, который удаляемых элементов (1, 5, 3) , нужно, чтобы в итоге получился список [0, 1, 2, 3, 7] . Как можно легче всего такое реализовать?
Отслеживать
76.7k 6 6 золотых знаков 54 54 серебряных знака 121 121 бронзовый знак
задан 19 фев 2016 в 13:59
A1essandro A1essandro
2,938 1 1 золотой знак 14 14 серебряных знаков 31 31 бронзовый знак
Сразу вопрос, что делать в ситуации [1, 2, 1, 2, 1, 3, 4] и (1, 2, 1) ?
19 фев 2016 в 14:04
удаляется первое вхождение
19 фев 2016 в 14:06
Это разовое действие или оно должно часто выполняться?
19 фев 2016 в 16:28
Не совсем понятен вопрос. Отвечу так: из первого комментария должно получиться [2, 1, 3, 4] , но если будет повтор [1, 2, 1, 2, 1, 2, 1] — в итоге должно получиться [2] . Это действие в коде выполняется в цикле, сначала подается один кортеж, потом другой и так далее, пока список не закончится.
19 фев 2016 в 17:59
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Фактически условие эквивалентно удалению подстроки из строки:
>>> list(bytes([0, 1, 2, 3, 1, 5, 3, 7]).replace(bytes((1, 5, 3)), b'')) [0, 1, 2, 3, 7]
Вот простой «в лоб» O(n*m) алгоритм по удалению subseq подпоследовательности из lst списка:
def removed(lst, subseq): subseq = type(lst)(subseq) # копируем, чтобы тот же тип был (для == ниже) i = 0 while i < len(lst): if lst[i:i+len(subseq)] == subseq: # нашли подпоследовательность i += len(subseq) # пропускаем else: yield lst[i] # передаём как есть i += 1
>>> list(removed([0, 1, 2, 3, 1, 5, 3, 7], (1, 5, 3))) [0, 1, 2, 3, 7]
Можно модифицировать алгоритм, чтобы принимать на вход произвольные итерируемые объекты, а не только последовательности. Или чтобы изменять входной список по месту без создания копии.
Отслеживать
ответ дан 20 фев 2016 в 20:48
52.2k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
Я бы попробовал что-то вроде такого: 1) изменение списка на месте (чуть сложнее)
def is_equal(lst, pattern): if len(lst) != len(pattern): return False for a, b in zip(lst, pattern): if a != b: return False return True def clear_list(lst, pattern): index = [] l = len(pattern) rng = iter(xrange(len(lst))) while True: try: i = next(rng) if is_equal(lst[i:i+l], pattern): for j in range(i, i + l): index.append(j) if j != i + l - 1: next(rng) except StopIteration: break index.reverse() for i in index: del lst[i] l = [1, 2, 1, 2, 1, 1, 2, 1, 3, 4, 1] p = (1, 2, 1) clear_list(l, p) print l # --> [2, 1, 3, 4, 1]
Оно даже работает.
2) для генерации нового списка (все проще):
def clear2(lst, pattern): res = [] l = len(pattern) r = iter(xrange(len(lst))) while True: try: i = next(r) if is_equal(lst[i:i+l], pattern): for j in range(i, i + l - 1): next(r) else: res.append(lst[i]) except StopIteration: break return res l = [1, 2, 1, 2, 1, 1, 2, 1, 3, 4, 1, 2] p = (1, 2, 1) print l print clear2(l, p) # -> [2, 1, 3, 4, 1, 2]
Потестил на 5 примерах, оба варианта рабочии.
Удаление вложенного списка из списка
В общем не могу понять как получить индекс вложенного списка а затем удалить выбранный список. Выручайте други!
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Удаление вложенного элемента списка
Есть такой список, с вложенными словарями и списками ip_addr=>,
Создание вложенного списка
Доброго времени суток. У меня возникло затруднение в написании функции, которая создает вложенный.
Проверка вложенного списка
Добрый вечер. Помогите пожалуйста реализовать функцию для проверки нахождения списка в самом себе.

Преобразование вложенного списка в строку и обратно
Добрый день! Нужна помощь. Не как не могу реализовать преобразования списка (конвертированного в.
Автоматизируй это!
![]()
7054 / 4559 / 1207
Регистрация: 30.03.2015
Сообщений: 13,132
Записей в блоге: 29

Сообщение было отмечено Vasya7 как решение
Решение
Vasya7, блин да что со способностями к формулировке мыслей у молодежи?
зачем столько непонятных слов, если можно просто указать начальный список и то что надо получить на выходе?
начальный вижу, что надо получить?
Добавлено через 1 минуту
вот пример удаления Ноель револьвера
1 2 3 4
>>> stuff=[['Winchester', 'Weapon', 100, 0.4, 13], ['Noel revolver', 'Weapon', 50, 0.4, 8], ['strong_cuirass', 'Armour', 50, 0.6, 1], ['Winchester', 'Weapon', 100, 0.4, 13]] >>> new_stuff = [e for e in stuff if e[0]!='Noel revolver'] >>> new_stuff [['Winchester', 'Weapon', 100, 0.4, 13], ['strong_cuirass', 'Armour', 50, 0.6, 1], ['Winchester', 'Weapon', 100, 0.4, 13]]
Регистрация: 07.06.2020
Сообщений: 31
А я думал, что наоборот правильно сформулировал))) А в остальном - то что доктор прописал! Спасибо!
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как из вложенного списка сделать словарь ?
Нашел скрипт не могу понять как он работает. Объясните пожалуйста подробно. dict = <> for y in.

Создать вложенный словарь из вложенного списка
Есть вложенный список с небольшой и не постоянной вложенностью типа ls=,,] нужно получить.

Удаление из списка
Считывается список из файла csv. Так как некоторые значения не указаны, на их месте в списке.
Удаление элементов из списка
Добрый день, сделал чтение из excel файла построчно import xlrd import os directory = 'excel.

Удаление элементов списка
Дорогие друзья, есть код класса. Как мне прописать метод удаления элементов из списка. Например, у.
Удаление элементов из списка
Всем привет! У меня проблема с удалением элементов из списка: не получается удалить элементы ' '.
Python, как удалить элемент в списке во время перебора?
Теперь надо как-то к примеру во время работы удалить например число 2, и чтобы далее список продолжил перебираться между 1 и 3.

rubro
26.01.17 09:29:14 MSK

RTFM! itertools.cycle хранит копию твоего списка.
panter_dsd ★★★★
( 26.01.17 09:50:12 MSK )
Ответ на: комментарий от panter_dsd 26.01.17 09:50:12 MSK

Да, я это уже заметил. Как бы только задачу решить в связи с этим знанием.
rubro
( 26.01.17 09:54:01 MSK ) автор топика
Ответ на: комментарий от rubro 26.01.17 09:54:01 MSK

a = [1, 2, 3] while a: for i in list(a): # remove element from a
panter_dsd ★★★★
( 26.01.17 09:57:11 MSK )
Последнее исправление: panter_dsd 26.01.17 09:58:00 MSK (всего исправлений: 1)
Ответ на: комментарий от panter_dsd 26.01.17 09:57:11 MSK

Спасибо за идею! Я немного модифицировал код:
import pdb a = [1, 2, 3] while a: for i in list(a): print(i) pdb.set_trace() # remove element from a
Далее заметил такой расклад:
1 > c:\demo_cycle.py(24)() -> for i in list(a): (Pdb) del a[1] (Pdb) continue 2 > c:\demo_cycle.py(24)() -> for i in list(a): (Pdb) continue 3 > c:\demo_cycle.py(24)() -> for i in list(a): (Pdb) continue 1 > c:\demo_cycle.py(24)() -> for i in list(a): (Pdb) continue 3
Выходит если во время выполнения удалить элемент, то далее скрипт всё равно будет думать что этот элемент существует, и эта «память» держится до конца текущий итерации (в следующей уже всё нормально). Порешать бы это как-то. Если удалили элемент - скрипт должен тут же это увидеть.
Удаление повторяющихся элементов из списка Python


Наиболее эффективный способ, реализующий удаление повторяющихся элементов из списка Python, основан на преобразовании типов данных: list -> set -> list . Суть этого способа заключается в том, что множество set не может содержать одинаковые элементы. Таким образом, при преобразовании списка во множество, дублирующиеся элементы исключаются.
Рассмотрим практический пример удаления повторяющихся элементов с помощью функции, преобразования во множество set() , после чего рассмотрим еще один способ, позволяющий исключить дубликаты из списка:
- Удаление повторяющихся элементов из списка с помощью функции set()
- Удаление дубликатов с использованием цикла for
Удаление повторяющихся элементов из списка Python с помощью set():
lst = [0, 1, 2, 3, 3, 2] lst = list(set(lst)) print(lst)
Вывод на экран:
[0, 1, 2, 3]
Пояснения к коду:
1. Сначала преобразуем список во множество с помощью функции set() . В качестве аргумента передаем функции set() исходный список lst=([0, 1, 2, 3, 3, 2]) . Так как множество в Python не может содержать одинаковые элементы, то в результате получим множество :
print(set([0, 1, 2, 3, 3, 2]))
Вывод на экран:
2. Так как в конечном итоге мы должны получить список без дубликатов, а на данном этапе мы имеем множество , то нам нужно преобразовать это множество в список. Это легко сделать с помощью функции list() :
print(list())
Вывод на экран:
[0, 1, 2, 3]
Кд удаления повторяющихся элементов из списка с помощью функции set() довольно прост и лаконичен, рекомендую удалять дубликаты из списка именно этим способом. Для сравнения рассмотрим еще один способ, который уже не так лаконичен, но по-прежнему прост:
Как удалить повторяющиеся элементы из списка Python с помощью цикла for:
lst = [0, 1, 2, 3, 3, 2] new_lst = [] for i in lst: if i not in new_lst: new_lst.append(i) print(new_lst)
Вывод на экран:
[0, 1, 2, 3]
Если быть точным, этот код не удаляет повторяющиеся элементы из списка, а создает новый список без дубликатов.
Пояснения по коду:
1. В строке new_lst = [] мы создаем новый пустой список, в который в дальнейшем будем добавлять элементы из списка lst , предварительно осуществив проверку на дублирование.
2. В цикле for будем осуществлять перебор элементов списка lst : если текущий элемент i не найден в списке new_lst , то есть if i not in new_lst , то этот элемент добавляется в список new_list с помощью метода append() : new_lst.append(i) .
Таким образом, в результате выполнения представленного кода, на выходе мы имеем 2 списка: исходный список lst и новый список new_lst , который содержит те же элементы, что и список lst , но за исключением дубликатов. При этом порядок следования элементов сохраняется.
![]()
У нас появился Telegram-канал для изучающих Python! Присоединяйтесь: вместе «питонить» веселее! Ссылка на канал: «Кодим на Python!»
