Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python删除for循环中的元素_Python - Fatal编程技术网

Python删除for循环中的元素

Python删除for循环中的元素,python,Python,[注意:即使使用临时数组(不修改循环数组),代码也没有给出列表b的正确答案] 从列表中删除奇数,代码见下文。 为什么它适用于列表a,而不是列表b?多谢各位 def purify(numbers): numbers_buf = numbers for item in numbers: if item % 2 == 1: numbers_buf.remove(item) return numbers_buf a = [1,2,3,4]

[注意:即使使用临时数组(不修改循环数组),代码也没有给出列表
b
的正确答案]

从列表中删除奇数,代码见下文。 为什么它适用于列表
a
,而不是列表
b
?多谢各位

def purify(numbers):
    numbers_buf = numbers
    for item in numbers:
        if item % 2 == 1:
            numbers_buf.remove(item)
    return numbers_buf

a = [1,2,3,4]
print purify(a)
[2, 4]

b = [4,5,5,4]
print purify(b)
[4,5,4]

这已经被问过很多次了,看看

你真的应该做:

even = [a for a in numbers if a%2 == 0]

这已经被问过很多次了,看看

你真的应该做:

even = [a for a in numbers if a%2 == 0]

你正在做两件你可能不应该做的事情,因为他们都在自找麻烦

  • 在对数组进行迭代时,永远不要向数组中添加项或从数组中删除项。这将混淆Python和您,几乎肯定不会达到预期的结果

  • 无论如何,您都不应该在适当的位置修改数组。函数不获取数组的副本;它正在修改调用方传入的实际数组。这可能会让所有相关人员感到惊讶:

    a = [1,2,3,4]
    print purify(a)        #=> [2, 4]
    print a                #=> [2, 4]
    
  • 您应该构造并返回一个新数组,或者更改函数名以指示(类似于
    排序
    排序
    内置):


    你正在做两件你可能不应该做的事情,因为他们都在自找麻烦

  • 在对数组进行迭代时,永远不要向数组中添加项或从数组中删除项。这将混淆Python和您,几乎肯定不会达到预期的结果

  • 无论如何,您都不应该在适当的位置修改数组。函数不获取数组的副本;它正在修改调用方传入的实际数组。这可能会让所有相关人员感到惊讶:

    a = [1,2,3,4]
    print purify(a)        #=> [2, 4]
    print a                #=> [2, 4]
    
  • 您应该构造并返回一个新数组,或者更改函数名以指示(类似于
    排序
    排序
    内置):

    在遍历列表时操作/删除元素将更改元素的索引,
    numbers\u buf=numbers
    创建对
    numbers
    列表的引用,基本上是指向同一对象的指针,因此从一个对象中删除,从两个对象中删除

    使用
    numbers[:]
    创建副本/新对象

    运行以下函数以帮助澄清,请参见3和4如何以某种方式运行程序:

    def purify(numbers):
        numbers_buf = numbers
        should_be = numbers[:]
        for ind, item in enumerate(numbers):
            print("{} should be at {}, is at {}".format(item,should_be.index(item),ind))
            if item % 2:
                numbers_buf.remove(item)
        return numbers_buf
    print(purify([4,5,4,7,3,1]))
    
    如果确实希望使用列表组件修改原始对象:

    def purify(numbers):
        numbers[:] = [x for x in numbers if not x % 2]
        return numbers
    
    您还可以使用
    反向

    def purify(numbers):
        for item in reversed(numbers):
            if item % 2:
                numbers.remove(item)
        return numbers
    
    在遍历列表时操作/删除元素将更改元素的索引,
    numbers\u buf=numbers
    创建对
    numbers
    列表的引用,基本上是指向同一对象的指针,因此从一个对象中删除,从两个对象中删除

    使用
    numbers[:]
    创建副本/新对象

    运行以下函数以帮助澄清,请参见3和4如何以某种方式运行程序:

    def purify(numbers):
        numbers_buf = numbers
        should_be = numbers[:]
        for ind, item in enumerate(numbers):
            print("{} should be at {}, is at {}".format(item,should_be.index(item),ind))
            if item % 2:
                numbers_buf.remove(item)
        return numbers_buf
    print(purify([4,5,4,7,3,1]))
    
    如果确实希望使用列表组件修改原始对象:

    def purify(numbers):
        numbers[:] = [x for x in numbers if not x % 2]
        return numbers
    
    您还可以使用
    反向

    def purify(numbers):
        for item in reversed(numbers):
            if item % 2:
                numbers.remove(item)
        return numbers
    

    如果要使用remove方法保留并返回相同的列表,可以尝试以下操作:

    def purify(numbers):
    
    for item in numbers:
        if item % 2 == 1:
            count = numbers.count(item)
            for i in range(count):
                numbers.remove(item)
    return numbers
    

    如果要使用remove方法保留并返回相同的列表,可以尝试以下操作:

    def purify(numbers):
    
    for item in numbers:
        if item % 2 == 1:
            count = numbers.count(item)
            for i in range(count):
                numbers.remove(item)
    return numbers
    

    你的问题源于这样一个事实,即你没有像你希望的那样,在一个不同的列表上循环。您希望避免在列表上循环时从列表中删除某些内容,这就是为什么您使用
    numbers\u buf=numbers

    但是,请注意,没有创建新列表:

    In [73]: numbers = list(range(10))
    
    In [74]: numbers
    Out[74]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    In [75]: id(numbers)
    Out[75]: 4469310792
    
    In [76]: numbers_buf = numbers
    
    In [77]: id(numbers)
    Out[77]: 4469310792
    
    In [78]: id(numbers_buf)
    Out[78]: 4469310792
    
    In [79]: id(numbers_buf) == id(numbers)
    Out[79]: True
    
    In [80]: numbers
    Out[80]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    In [81]: numbers_buf
    Out[81]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    In [82]: numbers.append(10)
    
    In [83]: numbers_buf
    Out[83]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    最后请注意,当我将
    10
    附加到
    numbers
    时,它也会附加到
    numbers\u buf
    。这是因为python在创建包含数字的新列表时,不会创建包含数字的新列表;它只需创建名称
    numbers\u buf
    ,并使其指向与
    numbers
    指向的结构完全相同的结构(这就是
    id(numbers)
    东西显示的内容)。您可以按如下方式解决此问题:

    In [84]: numbers_buf_new = numbers[:]
    
    In [85]: id(numbers_buf_new)
    Out[85]: 4469329032
    
    In [86]: id(numbers_buf_new) == id(numbers)
    Out[86]: False
    
    In [87]: numbers
    Out[87]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    In [88]: numbers_buf_new
    Out[88]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    In [89]: numbers.append(11)
    
    In [90]: numbers
    Out[90]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    
    In [91]: numbers_buf_new
    Out[91]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    你的问题源于这样一个事实,即你没有像你希望的那样,在一个不同的列表上循环。您希望避免在列表上循环时从列表中删除某些内容,这就是为什么您使用
    numbers\u buf=numbers

    但是,请注意,没有创建新列表:

    In [73]: numbers = list(range(10))
    
    In [74]: numbers
    Out[74]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    In [75]: id(numbers)
    Out[75]: 4469310792
    
    In [76]: numbers_buf = numbers
    
    In [77]: id(numbers)
    Out[77]: 4469310792
    
    In [78]: id(numbers_buf)
    Out[78]: 4469310792
    
    In [79]: id(numbers_buf) == id(numbers)
    Out[79]: True
    
    In [80]: numbers
    Out[80]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    In [81]: numbers_buf
    Out[81]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    In [82]: numbers.append(10)
    
    In [83]: numbers_buf
    Out[83]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    最后请注意,当我将
    10
    附加到
    numbers
    时,它也会附加到
    numbers\u buf
    。这是因为python在创建包含数字的新列表时,不会创建包含数字的新列表;它只需创建名称
    numbers\u buf
    ,并使其指向与
    numbers
    指向的结构完全相同的结构(这就是
    id(numbers)
    东西显示的内容)。您可以按如下方式解决此问题:

    In [84]: numbers_buf_new = numbers[:]
    
    In [85]: id(numbers_buf_new)
    Out[85]: 4469329032
    
    In [86]: id(numbers_buf_new) == id(numbers)
    Out[86]: False
    
    In [87]: numbers
    Out[87]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    In [88]: numbers_buf_new
    Out[88]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    In [89]: numbers.append(11)
    
    In [90]: numbers
    Out[90]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    
    In [91]: numbers_buf_new
    Out[91]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    您的函数以另一种方式工作,超出了您的预期。for循环使用第一个元素,而不是第二个元素,等等,所以当您删除一个元素时,其他元素会改变它们的位置,并且当它们前面有另一个奇数时,可以被它跳过(在您的例子中就是这样)

    您可以改为使用此代码:

    def purify(numbers):
    return [x for x in numbers if x % 2 == 0]   
    

    它将分别为a和b返回[2,4][4,4]。for循环使用第一个元素,而不是第二个元素,等等,所以当您删除一个元素时,其他元素会改变它们的位置,并且当它们前面有另一个奇数时,可以被它跳过(在您的例子中就是这样)

    您可以改为使用此代码:

    def purify(numbers):
    return [x for x in numbers if x % 2 == 0]   
    

    它将分别为a和b返回[2,4][4,4]

    如果没有必要修改列表,请尝试列表理解,如
    返回[x代表x,如果不是x%2]
    您可以检查@James Sapam,其中一个也被标记为重复。它链接到我4-5年前的评论:DIf如果没有必要修改列表,请尝试列表理解,如
    返回[x代表x,如果不是x%2]
    你能检查这个@James Sapam吗