Удалить первое вхождение заданного элемента в список
Необходимо удалить первое вхождение заданного элемента в список и из двух списков создать третий список из элементов первого, которые не принадлежат второму.
Очень прошу, подскажите, как правильно это сделать? (особенно с созданием третьего списка)
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Удалить из списка X первое вхождение элемента A в список X на верхнем уровне
DEL (A,X) удаляет из списка X первое вхождение элемента A в список X на верхнем уровне. как решить.
Определить количество вхождений заданного элемента в список, и удалить каждое четное его вхождение
Написать процедуру, производящую со списком чисел следующее действие: определяет количество.
Первое вхождение заданного элемента
Здравствуйте! Есть задача: удалить первое вхождение заданного элемента. Есть код: domains.
814 / 526 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
Сообщение от Alliettt 
удалить первое вхождение заданного элемента в список
1 2 3 4 5 6 7 8 9 10 11
>>> a = [1,2,3] >>> a.remove(2) >>> a [1, 3] >>> a.pop(0) 1 >>> a [3] >>> del a[0] >>> a []
Сообщение от Alliettt 
из двух списков создать третий список из элементов первого, которые не принадлежат второму
set.difference(other, . ) или set — other — . — множество из всех элементов set, не принадлежащие ни одному из other.
Добавлено через 1 минуту
а если повторяющиеся элементы нужно сохранить, то тогда цикл в помощь
Регистрация: 23.12.2019
Сообщений: 18
простите, неверно указал задание, забыл введи,Что списки должны быть односвязными.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Удалить первое вхождение элемента массива
Имеется некоторый массив целых чисел. С клавиатуры вводится значение элемента, который надо.
В заданном бинарном дереве найти первое вхождение заданного элемента
в заданном бинарном дереве найти первое вхождение заданного элемента и напечатать пройденные при.

Функция возвращающая указатель на первое вхождение элемента в список
Она звучит так: LPos (a, L), возвращающую указатель на первое вхождение элемента а в список L, или.
Удалить первое вхождение элемента E из списка X используя рекурсию
Здравствуйте есть такое задание "Удалить первое вхождение элемента E из списка X используя рекурсию.
Методом модифицированного прямого поиска найти первое вхождение заданного элемента в массиве
Здравствуйте, пользуясь методом модифицированного прямого поиска элемента в массиве, нужно.
Для данного элемента Е, входящего в список, оставить только его первое вхождение
Помогите пожалуйста с динамическими структурами в ПАСКАЛЬ АБЦ. Уже сижу два дня мозги кипят .
Python: проверить индекс элемента в списке
Списки полезны по-разному по сравнению с другими типами данных из-за их универсальности. В этой статье мы рассмотрим одну из самых распространенных операций со списками — поиск индекса элемента.
Мы рассмотрим различные сценарии поиска элемента, то есть нахождение первого, последнего и всех вхождений элемента. А также что происходит, когда искомого элемента не существует.
Использование Функции index()
Все операции, упомянутые в предыдущем абзаце, можно выполнить с помощью встроенной функции index() . Синтаксис этой функции:
index(element[, start[, end]])
Параметр element , естественно, представляет собой элемент который мы ищем. Параметры start и end являются необязательными и представляют диапазон индексов, в котором мы ищем element .
Значение по умолчанию для start — 0 (поиск с начала), а значение по умолчанию для end — это количество элементов в списке (поиск до конца списка).
Функция возвращает первую позицию element в списке, которую она могла найти, независимо от того, сколько равных элементов осталось после первого вхождения.
Нахождение первого появления элемента
Использование функции index() без установки каких-либо значений для start и end даст нам первое вхождение искомого element :
my_list = ['a', 'b', 'c', 'd', 'e', '1', '2', '3', 'b'] first_occurrence = my_list.index('b') print("First occurrence of 'b' in the list: ", first_occurrence)
Что даст нам ожидаемый результат:
First occurrence of 'b' in the list: 1
Поиск всех вхождений элемента
Чтобы найти все вхождения элемента, мы можем использовать необязательный параметр start , чтобы мы выполняли поиск только в определенных сегментах списка.
Например, предположим, что первое вхождение элемента в index 3 . Чтобы найти следующий, нам нужно будет продолжить поиск первого появления этого элемента после индекса 3 . Мы будем повторять этот процесс, меняя место начала поиска, пока мы найдем новые вхождения элемента:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a'] all_occurrences = [] last_found_index = -1 element_found = True while element_found: try: last_found_index = my_list.index('a', last_found_index + 1) all_occurrences.append(last_found_index) except ValueError: element_found = False if len(all_occurrences) == 0: print("The element wasn't found in the list") else: print("The element was found at: " + str(all_occurrences))
Запуск этого кода даст нам:
The element was found at: [1, 5, 7]
Здесь нам пришлось использовать блок try , так как функция index() выдает ошибку, когда не может найти указанный element в заданном диапазоне. Это может быть необычно для разработчиков, которые больше привыкли к другим языкам, поскольку такие функции обычно возвращают -1 / null , когда элемент не может быть найден.
Однако в Python мы должны быть осторожны и использовать блок try при использовании этой функции.
Другой, более изящный способ сделать то же самое — использовать понимание списка и полностью игнорировать функцию index() :
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a'] all_occurrences = [index for index, element in enumerate(my_list) if element == 'a'] print("The element was found at: " + str(all_occurrences))
Что даст нам тот же результат, что и раньше. У этого подхода есть дополнительное преимущество в том, что он не использует блок try .
Нахождение последнего появления элемента
Если вам нужно найти последнее вхождение элемента в списке, есть два подхода, которые вы можете использовать с функцией index() :
- Переверните список и найдите первое вхождение в перевернутом списке
- Просмотрите все вхождения элемента и отслеживайте только последнее вхождение
Что касается первого подхода, если бы мы знали первое вхождение element в обратном списке, мы могли бы найти позицию последнего вхождения в исходном. В частности, мы можем сделать это, вычтя reversed_list_index — 1 из длины исходного списка:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a'] reversed_list_index = my_list[::-1].index('n') # or alteratively: # reversed_list_index2 = list(reversed(my_list)).index('n') original_list_index = len(my_list) - 1 - reversed_list_index print(original_list_index)
Что даст нам желаемый результат:
Что касается второго подхода, мы могли бы настроить код, который мы использовали, чтобы найти все вхождения, и отслеживать только последнее обнаруженное вхождение:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a'] last_occurrence = -1 element_found = True while element_found: try: last_occurrence = my_list.index('n', last_occurrence + 1) except ValueError: element_found = False if last_occurrence == -1: print("The element wasn't found in the list") else: print("The last occurrence of the element is at: ", last_occurrence)
Что даст нам тот же результат:
Вывод
Мы рассмотрели некоторые из наиболее распространенных способов использования функции index() и способы избежать ошибки в некоторых случаях.
Помните о потенциально необычном поведении функции index() , когда она выдает ошибку вместо возврата -1 / None , когда элемент не найден в списке.
Поиск элемента в списке Python

Сегодня я расскажу, как проверить, содержит ли список элемент с помощью разных операторов в Python.
Используя цикл for
В качестве примера, я буду использовать список строк, содержащих несколько животных:
animals = ['Dog', 'Cat', 'Bird', 'Fish']
Простой и рудиментарный метод проверки, содержит ли список элемент: наш метод проходит через элемент и проверяет, соответствует ли элемент, на котором мы находимся, тому, который мы ищем. Давайте для этого воспользуемся циклом for:
for animal in animals: if animal == 'Bird': print('Chirp!')
Chirp!
Используя оператор in
Теперь более лаконичным подходом было бы использование встроенного оператора in, но с оператором if вместо оператора for. В паре с if он возвращает True, если элемент существует в последовательности или нет. Синтаксис оператора in выглядит следующим образом:
element in list
Используя этот оператор, мы можем сократить наш предыдущий код в один оператор:
if 'Bird' in animals: print('Chirp')
Chirp
Этот подход имеет ту же эффективность, что и цикл for, поскольку оператор in, используемый таким образом, вызывает функцию list.__contains__, которая по своей сути циклически проходит через список — хотя это гораздо читабельнее.
Используя оператор not in
Вы можете использовать оператор not in, который является логической противоположностью оператору in. Он возвращает True, если элемент не присутствует в последовательности.
Давайте перепишем предыдущий пример кода, чтобы использовать оператор not in:
if 'Bird' not in animals: print('Chirp')
Запуск этого кода ничего не даст, так как Bird присутствует в нашем списке.
Но если мы попробуем это с Wolf:
if 'Wolf' not in animals: print('Howl')
Howl
С помощью лямбда функции
Еще один способ проверить, присутствует ли элемент — отфильтровать все, кроме этого элемента, точно так же, как просеять песок и проверить, остались ли в конце какие-нибудь раковины. Встроенный метод filter() принимает в качестве аргументов лямбда-функцию и список. Здесь мы можем использовать лямбда-функцию для проверки нашей строки «Bird» в списке animals.
Затем мы оборачиваем результаты в list(), так как метод filter() возвращает объект filter, а не результаты. Если мы упакуем объект filter в список, он будет содержать элементы, оставшиеся после фильтрации:
retrieved_elements = list(filter(lambda x: 'Bird' in x, animals)) print(retrieved_elements)
['Bird']
Сейчас этот подход не самый эффективный. Это довольно медленнее, чем предыдущие три подхода, которые мы использовали. Сам метод filter() эквивалентен функции генератора:
(item for item in iterable if function(item))
Замедление производительности этого кода, помимо всего прочего, происходит из-за того, что мы преобразуем результаты в список в конце концов, а также выполняем функцию для элемента на каждой итерации.
Используя функцию any
Еще один отличный встроенный подход заключается в использовании функции any, которая является просто вспомогательной функцией, которая проверяет, есть ли какие-либо (по крайней мере 1) экземпляры элемента в списке. Он возвращает True или False в зависимости от наличия или отсутствия элемента:
if any(element in 'Bird' for element in animals): print('Chirp')
Поскольку это приводит к True, наш оператор print сработает:
Chirp
Этот подход также является эффективным способом проверки наличия элемента. Он ничем не уступает первым трём проверкам!
Используя метод count
Наконец, мы можем использовать функцию count, чтобы проверить, присутствует ли элемент или нет:
list.count(element)
Эта функция возвращает вхождение данного элемента в последовательность. Если он больше 0, мы можем быть уверены, что данный элемент находится в списке.
Давайте проверим результаты функции count:
if animals.count('Bird') > 0: print("Chirp")
Функция count по своей сути зацикливает список, чтобы проверить количество вхождений, и этот код приводит к запуску print:
Chirp
Заключение
В этой статье я рассмотрел несколько способов, как проверить, присутствует ли элемент в списке или нет. Я использовал цикл for, операторы in и not in, а также методы filter, any и count.
Первое и последнее вхождение без метода count и циклов
Дана строка. Если в этой строке буква f встречается только один раз, выведите её индекс. Если она встречается два и более раз, выведите индекс её первого и последнего появления. Если буква f в данной строке не встречается, ничего не выводите. При решении этой задачи нельзя использовать метод count и циклы. это решение которое проходит проверку:
s = input() a = s.find('f') b = s.rfind('f') if a == -1: print() elif a == b: print(a) else: print(a, b)
есть ли решения это задачи которые бы соответствовали требованиям
При решении этой задачи нельзя использовать метод count и циклы.
Отслеживать
52.2k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
задан 3 фев 2018 в 6:47
35 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
7 ответов 7
Сортировка: Сброс на вариант по умолчанию
str.index
Чтобы распознать случаи: 0, 1, 2+ вхождений без явных циклов, s.count(‘f’) метода, очевидная альтернатива s.find() методу из вопроса — это s.index() :
#!/usr/bin/env python3 s = input() count = len(s) - len(s.replace('f', '')) if count == 0: pass elif count == 1: print(s.index('f')) else: # count > 1 print(s.index('f'), s.rindex('f'))
try/except
Можно без явного if :
try: i = s.index('f') except ValueError: # count == 0 pass else: try: j = s.rindex('f', i+1) except ValueError: # count == 1 print(i) else: # count > 1 print(i, j)
Рекурсия
Можно рекурсивный find() реализовать:
def find(char, s, i=0): return -1 if i == len(s) else i if char == s[i] else find(char, s, i+1)
Тогда решение почти идентично варианту из вопроса (разница в том, что ничего не выводится для count==0 случая) :
s = input() i = find('f', s) j = len(s) - 1 - find('f', s[::-1]) # rfind('f', s) if i == -1: # count == 0 pass elif i == j: # count == 1 print(i) else: # count > 1 print(i, j)
Итераторы
Можно find() даже без индексации и явного len(s) реализовать:
def find(char, s, i=0): it = iter(s) first = next(it, None) return -1 if first is None else i if first == char else find(char, it, i+1)
Распаковка аргументов
Можно вообще не вызывать явно встроенные функции, опираясь на распаковку аргументов:
def find(char, s): def f(first, *rest, i=0): return i if first == char else -1 if not rest else f(*rest, i=i+1) return -1 if not s else f(*s)
Связные списки
Используя это представление, можно со строками как со связными списками работать. К примеру, чтобы обратить строку, получив связный список:
def reversed_as_llist(s): def f(first, *rest, llist=None): return f(*rest, llist=(first, llist)) if rest else (first, llist) return f(*s) if s else None
>>> reversed_as_llist('abc') ('c', ('b', ('a', None)))
Используя явные функции доступа:
first = lambda llist: llist[0] if llist else None rest = lambda llist: llist[1] if llist else None
легко найти размер списка, реализовать поиск по аналогии с приведёнными решениями:
def llist_len(llist, size=0): return llist_len(rest(llist), size+1) if llist else size def llist_find(char, llist, i=0): return -1 if not llist else i if char == first(llist) else llist_find(char, rest(llist), i+1)
Это позволяет определить rfind() без len(s) и индексации ( s[::-1] ):
def rfind(char, s): L = reversed_as_llist(s) i = llist_find(char, L) return i if i == -1 else llist_len(L) - 1 - i
При желании, можно отказаться и от рекурсии с именованными функциями (к примеру, используя Y combinator) и даже не использовать явно числа (к примеру, заменяя на Church numerals).
heapq.nlargest
Если использовать встроенные функции, стандартную библиотеку, то есть множество решений, которые скрывают явный цикл и позволяют без .count(‘f’) обойтись:
import heapq indices = heapq.nlargest(2, range(len(s)), key=lambda i: s[i] == 'f') fs = ''.join(map(s.__getitem__, indices)) if fs == 'ff': # count == 2+ print(*indices) elif fs[:1] == 'f': # count == 1 print(indices[0]) # else print nothing # count == 0
