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.这里将更详细地解释这种差异.
更简单:
>>> 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保存变量名称,如变量数据,r或num_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.这意味着,r和mum_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)
| 归档时间: |
|
| 查看次数: |
24887 次 |
| 最近记录: |