Разница между и - PullRequest
       13

Разница между и

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

Когда я пытаюсь зациклить, чтобы удалить все a из списка, вот мой код:

list5 = ["a","b","a","b","a","b","c"]
def remove_values_from_list(_list, val):
        for val in _list:
            _list.remove(val)
remove_values_from_list(list5, "a")
print(list5)

он возвращает:

["b","b","b"]

, и когда я использую while вместо, он возвращает:

list5 = ["a","b","a","b","a","b","c"]
def remove_values_from_list(_list, val):
        while val in _list:
            _list.remove(val)
remove_values_from_list(list5, "a")
print(list5)



["b","b","b","c"]

Может кто-нибудь объяснить мне, почему цикл for не возвращает последний c?

Ответы [ 2 ]

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

Это потому, что вы используете val в цикле for и параметр, который получает ваша функция, называется также val.

Попробуйте что-то вроде этого:

def remove_values_from_list(_list, val):
    for v in _list:
        if v == val:
            _list.remove(v)

Более эффективный способсделать это:

def remove_values_from_list(_list, val):
    return list(filter(lambda x: x!=val, _list ))
0 голосов
/ 31 января 2019

Сначала вам нужно исправить цикл for, он должен быть:

def remove_values_from_list(_list, val):
        for _val in _list:
            if _val == val:
                _list.remove(val)
        print(_list)

OUTPUT:

['b', 'b', 'b', 'c']

, а затем цикл while:

def remove_values_from_list(_list, val):
    while(val in _list):
        _list.remove(val)
    print(_list)

remove_values_from_list(list5, "a")

ВЫХОД:

['b', 'b', 'b', 'c']

РЕДАКТИРОВАТЬ:

Вы должны изменить свой цикл while, как:

while True:
    if val not in _list:
        break
    else:
        _list.remove(val)
print(_list)

РЕДАКТИРОВАТЬ 2:

Спасибо @Dukeling за улов:

Вы не можете удалять элементы (последовательные) из списка, просматривая его с помощью for-loop.Для этого мы можем перебрать его копию следующим образом:

def remove_values_from_list(_list, val):

    for _val in _list[:]:
        if _val == val:
            _list.remove(_val)
    print(_list)

list5 = ["a", "a"]

remove_values_from_list(list5, "a") 

ВЫХОД:

[]
...