Я хочу удалить все строки из списка целых чисел. Почему это не работает? - PullRequest
0 голосов
/ 01 мая 2020

Когда я запускаю этот код, он работает, но по какой-то причине он удаляет только строки 'p' и 'h', а не строку 'z'. Почему?

def filter_list(l):
    for item in l:
        if item == str(item):
            l.remove(item)
    return l
print(filter_list([1, 9, 3, 'p', 'z', 7, 'h']))

output:[1, 9, 3, 'z', 7]

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

В приведенном ниже коде я создал временный список, который будет иметь все «строки». Затем l oop через временный список и удалил строку из основного списка.

def filter_list(l):
    temp=[]
    for items in l:
        if str == type(items):
            temp.append(items)

    for item_to_remove in temp:
        l.remove(item_to_remove)
    return(l)

print(filter_list([1, 9, 3, 'p', 'z', 7, 'h']))

output

[1, 9, 3, 7]
0 голосов
/ 01 мая 2020

Так как вы выполняете удаление, следующий элемент, по которому начинается итерация списка, равен 7, а не 'z'

в вашей 4-й итерации l oop, вы узнаете 'p' в быть строкой. Индекс «p» равен 3. Как только вы удалите, индекс «z» теперь равен 3, и, поскольку ваш l oop идет в следующий раз, он пропускает «z» и идет прямо к 7.

Попробуйте этот эксперимент, если вы замените 'z' на 'p', ваш l oop не удалит 'p'. Ваша логика c для проверки того, является ли элемент строкой или нет, не ошибочна, скажем, [в идеале вы должны использовать isinstance (элемент, тип)], но это ваша логика c удаления элемента, вызвавшего это.

...