Python:从数字列表中删除底片

use*_*743 6 python list negative-number

问题是从数字中删除负数.

remove_negs([1, 2, 3, -3, 6, -1, -3, 1])被执行,其结果是:[1, 2, 3, 6, -3, 1].结果假设是[1, 2, 3, 6, 3, 1].发生的事情是,如果一行中有两个负数(例如-1, -3),那么第二个数字将不会被删除.def main():numbers = input("输入数字列表:")remove_negs(数字)

def remove_negs(num_list): 
  '''Remove the negative numbers from the list num_list.'''
    for item in num_list: 
        if item < 0: 
           num_list.remove(item) 

    print num_list

main()
Run Code Online (Sandbox Code Playgroud)

ars*_*jii 12

在迭代它时从列表中删除元素通常是一个坏主意(请参阅我的注释中的链接以获取解释为什么会这样).更好的方法是使用列表理解:

num_list = [item for item in num_list if item >= 0]
Run Code Online (Sandbox Code Playgroud)

请注意,上面的行创建了一个列表并分配num_list给它.您还可以对表单进行"就地"分配

num_list[:] = ...
Run Code Online (Sandbox Code Playgroud)

它不会在内存中创建新列表,而是修改已经指向的内存位置num_list.这里将更详细地解释这种差异.


Joh*_*024 8

更简单:

>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> [x for x in a if x >= 0 ]
[1, 2, 3, 6, 1]
Run Code Online (Sandbox Code Playgroud)

如果你真的想循环,试试这个:

def remove_negs(num_list): 
    r = num_list[:]
    for item in num_list: 
        if item < 0: 
           r.remove(item) 
    print r
Run Code Online (Sandbox Code Playgroud)

这样做你想要的:

>>> remove_negs([ 1, 2, 3, -3, 6, -1, -3, 1])
[1, 2, 3, 6, 1]
Run Code Online (Sandbox Code Playgroud)

关键是赋值语句r = num_list[:]复制num_list.为了不混淆循环,我们然后从而r不是从我们循环的列表中删除项目.

更多: Python对变量的处理有点微妙.Python保存变量名称,如变量数据,rnum_list与变量数据分开,例如[1, 2, 3, 6, 1].名称只是指向数据的指针.考虑赋值语句:

r = num_list
Run Code Online (Sandbox Code Playgroud)

该语句后运行,r并且num_list都指向相同的数据.如果您对r数据进行了更改,那么您也会对数据进行更改,num_list因为它们都指向相同的数据.现在,考虑一下:

r = num_list[:]
Run Code Online (Sandbox Code Playgroud)

这个语句告诉python num_list只采用它的某些元素来修改数据.因此,python会复制num_list数据.恰好这样,[:]指定我们希望所有num_list数据都保持不变,但这并不能阻止python制作副本.副本分配给r.这意味着,rmum_list现在都指向不同的数据.我们可以对r数据进行更改,但不会影响num_list数据,因为它们具有不同的数据.

如果这对您来说是新手,您可能需要查看本教程中有关python的变量名称和变量数据的方法: 了解Python变量和内存管理

例子:

>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> b = a   # a and b now point to the same place
>>> b.remove(-1) 
>>> a
[1, 2, 3, -3, 6, -3, 1]
Run Code Online (Sandbox Code Playgroud)

对比:

>>> a = [ 1, 2, 3, -3, 6, -1, -3, 1]
>>> b = a[:] # a and b now point to different data
>>> b
[1, 2, 3, -3, 6, -1, -3, 1]
>>> b.remove(-1)
>>> b
[1, 2, 3, -3, 6, -3, 1]
>>> a
[1, 2, 3, -3, 6, -1, -3, 1]
Run Code Online (Sandbox Code Playgroud)


小智 5

另一种解决方案

filter( lambda x: x>0, [ 1, 2, 3, -3, 6, -1, -3, 1])
[1, 2, 3, 6, 1]
Run Code Online (Sandbox Code Playgroud)