【问题标题】:Difference between for and whilefor 和 while 的区别
【发布时间】:2019-06-24 13:31:02
【问题描述】:

当我尝试 for 循环从列表中删除所有 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 而不是 for 它返回时:

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 吗?

【问题讨论】:

  • 你的while loop在哪里?
  • @user5173426 在同一代码中更改 while 而不是 for。
  • @BarotShalin 在您的问题中也包括该部分。
  • 为什么你的 for 循环应该返回 ["b","b","b"] 而它实际上应该返回 ['b', 'b', 'b', 'c']

标签: python list for-loop data-structures while-loop


【解决方案1】:

你需要先修复你的 for 循环,它应该是:

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

输出:

['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") 

输出:

[]

【讨论】:

  • 哦,明白了!非常感谢您的帮助
  • 我已经尝试过了,但我必须等待几分钟,因为我刚刚发布了问题。感谢您的帮助。
  • @BarotShalin 我编辑了更好地使用while循环的答案
  • 是的,我猜这样更有效率!谢谢。
  • @BarotShalin 你可以接受有帮助的答案!
【解决方案2】:

这是因为你在for循环中使用了val,而你的函数接收的参数也被称为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 ))

【讨论】:

  • 明白了!感谢您的帮助
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 2020-11-06
  • 2016-08-02
  • 2011-02-11
  • 2014-05-19
  • 1970-01-01
  • 2021-05-12
相关资源
最近更新 更多