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

Как удалить элемент с конца списка python

  • автор:

Как удалить элементы без изменения списка?

Нужно удалить три 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 и удалим первый и последний узел из списка.

Удаление узла в начале списка

Если список пуст, будет выведено сообщение «Список пуст». Если список не пуст, мы сделаем так, чтобы голова указывала на следующий узел в списке; мы удалим первый узел.

Программа Python для удаления нового узла из начала двусвязного списка

Рассмотрим приведенный выше пример, где узел new был во главе списка. Сделать так, чтоб голова указывала на следующий узел в списке. Теперь узел 1 станет новой головой списка, таким образом, удалим новый узел.

Алгоритм

  1. Определите класс Node, который представляет узел в списке. У него будет три свойства: данные, предыдущее, которое будет указывать на предыдущий узел, и следующее, которое укажет на следующий узел.
  2. Определите еще один класс для создания двусвязного списка, и он имеет два узла: начало и конец. Первоначально голова и хвост будут указывать на null.
  3. 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

Удаление узла в конце списка

Теперь удалим узел в конце списка. Если список пуст, выведется сообщение «Список пуст». Если список не пуст, предыдущий узел хвоста станет новым хвостом списка, таким образом, удалится последний узел из списка.

Программа Python для удаления нового узла из конца двусвязного списка

В приведенном выше примере new был хвостом списка. Сделайте предыдущий узел хвоста, то есть узел 4, хвостом списка. Следующий узел 4 будет указывать на null.

Алгоритм

  1. Определите класс Node, который представляет узел в списке. У него будет три свойства: данные, предыдущее, которое будет указывать на предыдущий узел, и следующее, которое укажет на следующий узел.
  2. Определите еще один класс для создания двусвязного списка, и он имеет два узла: головной и хвостовой. Первоначально голова и хвост будут указывать на null.
  3. 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)

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

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