Перейти к содержимому

Как удалить список из списка python

  • автор:

Удаление «подсписка» из списка

Нужно удалить из списка в вхождения, да не просто по элементам, а прям множество. Т.е. если есть список: [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=>,

Создание вложенного списка
Доброго времени суток. У меня возникло затруднение в написании функции, которая создает вложенный.

Проверка вложенного списка
Добрый вечер. Помогите пожалуйста реализовать функцию для проверки нахождения списка в самом себе.

Преобразование вложенного списка в строку и обратно
Добрый день! Нужна помощь. Не как не могу реализовать преобразования списка (конвертированного в.

Автоматизируй это!

Эксперт Python

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

удалить повторяющиеся элементы из списка 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!»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *