Как проиндексировать, удалить и посчитать все экземпляры элемента в списке? - PullRequest
0 голосов
/ 28 января 2019

Я новичок в Python и пытаюсь что-то узнать о списках.В этом случае моей целью является индексирование, подсчет и удаление всех экземпляров элемента в списке.Индексирование, подсчет и удаление всех отлично работает отдельно, но я изо всех сил пытаюсь объединить его и получить желаемые результаты.Что я делаю не так?

def removing(letter,lst):
    '''This function should index and remove all entries of a letter within a list, returning the removed items' position within the original list. I then use len() function on the result-list to determine how many items have been indexed/deleted'''
    result=[]
    offset= -1
    list_new = lst.copy()
    while True:
        try:
            offset=list_new.index(letter, offset+1)
        except ValueError:
            return result
            print('Letter not found.')
        result.append(offset)
        lst.remove(letter)

Теперь я ожидал, что даже без клонирования списка это сработает, и функция вернет позиции букв и удалит их, но когда я определю lstи letter, запустите функцию, а затем скажите:

print(len(removing(letter,lst)))

Всегда отображается 0. Почему это?

РЕДАКТИРОВАТЬ: мне посоветовали вызвать функцию один раз и сохранитьрезультат, но я, когда я делаю следующее, результат тот же:

c=1
print(lst)
while (c==1):
    letter=input('What letter do you want to remove?\n')
    if letter in lst:
        var=removing(letter,lst)
        print(var)
        print(str(len(var))+' letters have been removed.')
        print(lst)
    else:
        c-1

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Спасибо всем за помощь, на мой вопрос ответили.Проблема была не в функции, а в том, что я вызывал ее несколько раз без сохранения результата.Конечный код выглядит так:

    lst= list('Nach langem rumprobieren haben nette Menschen mir bei der Vollendung dieser kleinen Übungsaufgabe geholfen.')

    def removing(letter,lst):
        'This function should remove all entries of a letter within a list'
    result=[]
    offset= -1
    list_new = lst.copy()
    while True:
        try:
            offset=list_new.index(letter, offset+1)
        except ValueError:
            return result
        result.append(offset)
        lst.remove(letter)

    c=1
    print(lst)
    while (c==1):
        letter=input('What letter do you want to remove?\n')
        if letter in lst:
            var=removing(letter,lst)
            print(var)
            print(str(len(var))+' letters have been removed.')
            print(lst)
        else:
            break
0 голосов
/ 29 января 2019

Вот мое решение:

import re

def removing(c, s):
    '''This function removes all occurences of 'c' in 's' and return a list of the replaced indices'''
    indices = [i.span()[0] for i in re.finditer(c, s)]
    return s.replace(c, ''), indices

А вот пример использования:

>>> removing('a', 'abracadabra')
('brcdbr', [0, 3, 5, 7, 10])
>>> 
>>> removing('a', 'aaaaa')
('', [0, 1, 2, 3, 4])
>>> 
0 голосов
/ 28 января 2019

Ваш цикл не обязателен и будет повторяться бесконечно.Попробуйте следующее:

lst = list('abracadabra')
letter = 'a'

var=removing(letter,lst)
print(var)  # [0, 3, 5, 7, 10]
print(str(len(var))+' letters have been removed.')  # 5 letters have been removed.
print(lst)  # ['b', 'r', 'c', 'd', 'b', 'r']

Другой способ написания функции чуть более питоническим способом будет выглядеть примерно так:

def remove(lst, item):
    new_list = []
    indices = []
    for i, x in enumerate(lst):
        if x == item:
            indices.append(i)
        else:
            new_list.append(x)
    return new_list, indices
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...