Как удалить элементы без изменения списка?
Нужно удалить три max-элемента из списка, причём нельзя изменять список. Как сделать тут копию этого списка(правильно) и удалить с конца списка и вернуться к нужному виду?
elements = [5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19, 20, 21, 22] elements_copy = elements.copy() for _ in range(3): elements_copy.remove(max(elements_copy)) print(elements, elements_copy, sep="\n")
Как это сделать БЕЗ циклов, с использованием функции? (чтобы список не изменялся, надо работать с копией списка, а потом вернуться к нормальному виду)
Отслеживать
5,173 8 8 золотых знаков 23 23 серебряных знака 41 41 бронзовый знак
задан 15 июн 2020 в 14:00
33 4 4 бронзовых знака
Вопрос противоречит сам себе: удаление элемента из списка автоматически является изменением списка. Так что то, что вы хотите, осуществить невозможно
15 июн 2020 в 14:13
Можно работать с копией и вернуться к начальному
15 июн 2020 в 14:15
Если работать с копией, то это получается создание нового списка без лишних элементов, а не удаление элементов
15 июн 2020 в 14:16
Если гарантируется, что исходный список отсортирован, то можно просто сделать elements[:-3]
15 июн 2020 в 14:44
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Как это сделать БЕЗ циклов, с использованием функции?
Можно реализовать рекурсию:
def f(li, n=3): if n == 0: return li li.remove(max(li)) return f(li, n-1)
Отслеживать
ответ дан 15 июн 2020 в 14:10
18.4k 5 5 золотых знаков 24 24 серебряных знака 48 48 бронзовых знаков
li.remove является изменением списка, что запрещено условием задачи
15 июн 2020 в 14:13
@andreymal Я предполагал, что автор передаст копию. Так же, как делает в своём коде.
15 июн 2020 в 14:14
Создание копии списка означает отсутствие удаления из исходного списка, что тоже противоречит условию задачи 🙂
15 июн 2020 в 14:15
А вообще если копии это нормально и filter подходит под условие «без циклов», то можно упороться в функциональщину и сделать что-то вроде li = list(filter(lambda x: x != max(li), li)) (при условии неповторяющихся элементов)
15 июн 2020 в 14:24
@Rintys Что значит «вернуться к начальному списку»? Если Вы делаете копию — у Вас 2 разных списка.
15 июн 2020 в 14:38
Если вдруг я правильно сумел понять задачу, то вот так:
elements = [5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19, 20, 21, 22] elements_copy = list(filter(lambda x: x not in sorted(elements)[-3:], elements)) print(elements, elements_copy, sep="\n")
[5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19, 20, 21, 22] [5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19]
В копию списка попадают все элементы кроме трёх максимальных, которые мы отобрали, взяв последние 3 элемента отсортированного во возрастанию списка. Для подобной фильтрации итерируемых объектов в Python есть специальная функция filter .
P.S. Реализация в виде отдельной функции по просьбе автора вопроса:
def filter3max(elements): return list(filter(lambda x: x not in sorted(elements)[-3:], elements)) elements = [5, 6, 7, 8, 9, 10, 9, 14, 15, 16, 17, 19, 20, 21, 22] print(elements, filter3max(elements), sep="\n")
Удаление элементов списка по условию
Удаление элемента из списка по условию
Здравствуйте, дорогие форумчане! Нужна Ваша помощь! Проблема: дан массив вида: , , , , ] . .

Удаление из списка строк, не удовлетворяющих условию
Напишите функцию remove_inappropriate(spells), принимающую единственный параметр — список строк.

Задача 4. «Удаление элементов по условию»
Задание: Создать список/массив L1 из 12 натуральных псевдослучайных чисел в диапазоне . Удалить из.

Добавление и удаление элементов списка, очистка списка, просмотр списка
Добрый вечер! помогите пожалуйста с решением не простой задачи. Предусмотреть меню, позволяющее.
Удаление данных из связанных ДВУХ таблиц по условию выпадающего списка
Всем, добрый вечер! Ребята, подкиньте пожалуйста идею, а лучше какой-нибудь пример. Задача на.
Удаление узла из начала и конца двусвязного списка в Python
В этой программе мы создадим двусвязный список в Python и удалим первый и последний узел из списка.
Удаление узла в начале списка
Если список пуст, будет выведено сообщение «Список пуст». Если список не пуст, мы сделаем так, чтобы голова указывала на следующий узел в списке; мы удалим первый узел.

Рассмотрим приведенный выше пример, где узел new был во главе списка. Сделать так, чтоб голова указывала на следующий узел в списке. Теперь узел 1 станет новой головой списка, таким образом, удалим новый узел.
Алгоритм
- Определите класс Node, который представляет узел в списке. У него будет три свойства: данные, предыдущее, которое будет указывать на предыдущий узел, и следующее, которое укажет на следующий узел.
- Определите еще один класс для создания двусвязного списка, и он имеет два узла: начало и конец. Первоначально голова и хвост будут указывать на null.
- 3deleteFromStart() удалит узел из начала списка:
- Сначала он проверяет, является ли заголовок нулевым (пустой список), а затем возвращается из функции, поскольку в списке нет узла.
- Если список не пуст, он проверит, есть ли в списке только один узел.
- Если в списке есть только один узел, он установит для начала и конца значение null.
- Если в списке более одного узла, заголовок укажет на следующий узел в списке и удалит старый головной узел.
а. display() покажет все узлы, присутствующие в списке.
- Определите новый узел «текущий», который будет указывать на голову.
- Печатайте current.data до тех пор, пока текущие не укажут на null.
- Текущий будет указывать на следующий узел в списке в каждой итерации.
Программа
#Represent a node of doubly linked list class Node: def __init__(self,data): self.data = data; self.previous = None; self.next = None; class DeleteStart: #Represent the head and tail of the doubly linked list def __init__(self): self.head = None; self.tail = None; #addNode() will add a node to the list def addNode(self, data): #Create a new node newNode = Node(data); #If list is empty if(self.head == None): #Both head and tail will point to newNode self.head = self.tail = newNode; #head's previous will point to None self.head.previous = None; #tail's next will point to None, as it is the last node of the list self.tail.next = None; else: #newNode will be added after tail such that tail's next will point to newNode self.tail.next = newNode; #newNode's previous will point to tail newNode.previous = self.tail; #newNode will become new tail self.tail = newNode; #As it is last node, tail's next will point to None self.tail.next = None; #deleteFromStart() will delete a node from the beginning of the list def deleteFromStart(self): #Checks whether list is empty if(self.head == None): return; else: #Checks whether the list contains only one element if(self.head != self.tail): #head will point to next node in the list self.head = self.head.next; #Previous node to current head will be made None self.head.previous = None; #If the list contains only one element #then, it will remove the node, and now both head and tail will point to None else: self.head = self.tail = None; #display() will print out the nodes of the list def display(self): #Node current will point to head current = self.head; if(self.head == None): print("List is empty"); return; while(current != None): #Prints each node by incrementing pointer. print(current.data), current = current.next; print(); dList = DeleteStart(); #Add nodes to the list dList.addNode(1); dList.addNode(2); dList.addNode(3); dList.addNode(4); dList.addNode(5); #Printing original list print("Original List: "); dList.display(); while(dList.head != None): dList.deleteFromStart(); #Printing updated list print("Updated List: "); dList.display();
Original List: 1 2 3 4 5 Updated List: 2 3 4 5 Updated List: 3 4 5 Updated List: 4 5 Updated List: 5 Updated List: List is empty
Удаление узла в конце списка
Теперь удалим узел в конце списка. Если список пуст, выведется сообщение «Список пуст». Если список не пуст, предыдущий узел хвоста станет новым хвостом списка, таким образом, удалится последний узел из списка.

В приведенном выше примере new был хвостом списка. Сделайте предыдущий узел хвоста, то есть узел 4, хвостом списка. Следующий узел 4 будет указывать на null.
Алгоритм
- Определите класс Node, который представляет узел в списке. У него будет три свойства: данные, предыдущее, которое будет указывать на предыдущий узел, и следующее, которое укажет на следующий узел.
- Определите еще один класс для создания двусвязного списка, и он имеет два узла: головной и хвостовой. Первоначально голова и хвост будут указывать на null.
- deleteFromEnd() удалит узел из конца списка:
- Сначала он проверяет, является ли заголовок нулевым (пустой список), а затем возвращается из функции, поскольку в списке нет узлов.
- Если список не пуст, он проверит, есть ли в списке только один узел.
- Если в списке есть только один узел, он установит для начала и конца значение null.
- Если в списке более одного узла, то предыдущий узел хвоста станет новым хвостом списка.
- Этот новый хвост будет указывать на null, поэтому удалите последний узел списка.
а. display() покажет все узлы, присутствующие в списке.
- Определите новый узел «текущий», который будет указывать на голову.
- Печатайте current.data до тех пор, пока текущие не укажут на null.
- Текущий будет указывать на следующий узел в списке в каждой итерации.
Программа
#Represent a node of doubly linked list class Node: def __init__(self,data): self.data = data; self.previous = None; self.next = None; class DeleteEnd: #Represent the head and tail of the doubly linked list def __init__(self): self.head = None; self.tail = None; #addNode() will add a node to the list def addNode(self, data): #Create a new node newNode = Node(data); #If list is empty if(self.head == None): #Both head and tail will point to newNode self.head = self.tail = newNode; #head's previous will point to None self.head.previous = None; #tail's next will point to None, as it is the last node of the list self.tail.next = None; else: #newNode will be added after tail such that tail's next will point to newNode self.tail.next = newNode; #newNode's previous will point to tail newNode.previous = self.tail; #newNode will become new tail self.tail = newNode; #As it is last node, tail's next will point to None self.tail.next = None; #deleteFromEnd() will delete a node from the end of the list def deleteFromEnd(self): #Checks whether list is empty if(self.head == None): return; else: #Checks whether the list contains only one node if(self.head != self.tail): #Previous node to the tail will become new tail self.tail = self.tail.previous; #Node next to current tail will be made None self.tail.next = None; #If the list contains only one element #Then it will remove the node, and now both head and tail will point to None else: self.head = self.tail = None; #display() will print out the nodes of the list def display(self): #Node current will point to head current = self.head; if(self.head == None): print("List is empty"); return; while(current != None): #Prints each node by incrementing pointer. print(current.data), current = current.next; print(); dList = DeleteEnd(); #Add nodes to the list dList.addNode(1); dList.addNode(2); dList.addNode(3); dList.addNode(4); dList.addNode(5); #Printing original list print("Original List: "); dList.display(); while(dList.head != None): dList.deleteFromEnd(); #Printing updated list print("Updated List: "); dList.display();
Original List: 1 2 3 4 5 Updated List: 1 2 3 4 Updated List: 1 2 3 Updated List: 1 2 Updated List: 1 Updated List: List is empty
Пожалуйста помогите срочно надо! Python!
Мы продолжаем тему структур данных и алгоритмов. И в этот раз вам нужно реализовать односвязный список.
Связный список — это структура данных, которая состоит из элементов, называющихся узлами. В узлах хранятся данные, а между собой узлы соединены связями. Связь — это ссылка на следующий или предыдущий элемент списка.
В односвязном списке связь — это ссылка только на следующий элемент. То есть в нём можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента, опираясь на содержимое текущего узла, невозможно.
Реализуйте такую структуру данных без использования стандартных структур Python (list, dict, tuple и прочие) и дополнительных модулей. Для структуры реализуйте следующие методы:
append — добавление элемента в конец списка,
get — получение элемента по индексу,
remove — удаление элемента по индексу.
Дополнительно: сделайте так, чтобы по списку можно было итерироваться с помощью цикла.
Пример основной программы:
print(‘Текущий список:’, my_list)
print(‘Получение третьего элемента:’, my_list.get(2))
print(‘Удаление второго элемента.’)
print(‘Новый список:’, my_list)
Текущий список: [10 20 30]
Получение третьего элемента: 30
Удаление второго элемента.
Новый список: [10 30]
Лучший ответ
Остальные ответы
class LinkedList:
class __Node:
def __init__(self, value):
self.value = value
self.nxt = None
def __init__(self, *args):
length = len(args)
self.__length = length
self.__head = self.__Node(args[0]) if length > 0 else None
self.__tail = self.__head
for i in range(1, length):
self.__tail.nxt = self.__Node(args[i])
self.__tail = self.__tail.nxt
def __iter__(self):
current = self.__head
while current is not None:
yield current.value
current = current.nxt
def __len__(self):
return self.__length
def __index_check(self, index):
if not 0 raise IndexError
def append(self, value):
if self.__length > 0:
self.__tail.nxt = self.__Node(value)
self.__tail = self.__tail.nxt
else:
self.__head = self.__tail = self.__Node(value)
self.__length += 1
def get(self, index):
self.__index_check(index)
current = self.__head
for _ in range(index):
current = current.nxt
return current.value
def remove(self, index):
self.__index_check(index)
if self.__length == 1:
self.__head = self.__tail = None
elif index == 0:
self.__head = self.__head.nxt
else:
current = self.__head
for _ in range(index — 1):
current = current.nxt
current.nxt = current.nxt.nxt
if index == self.__length — 1:
self.__tail = current
self.__length -= 1
my_list = LinkedList()
my_list.append(10)
my_list.append(20)
my_list.append(30)
print(‘Текущий список:’, my_list)
print(‘Получение третьего элемента:’, my_list.get(2))
print(‘Удаление второго элемента.’)
my_list.remove(1)
print(‘Новый список:’, my_list)
