如何使用python处理我的代码错误

如何使用python处理我的代码错误,python,list,Python,List,这是我的代码: a=[1,0,None,3] def b(my_list): for i in range(len(my_list)): if not my_list[i]: a.remove(my_list[i]) else: do_something() return my_list a = b(a) print a 错误是: Traceback (most recent call last

这是我的代码:

a=[1,0,None,3]

def b(my_list):
    for i in range(len(my_list)):
        if not my_list[i]:
            a.remove(my_list[i])
        else:
            do_something()
    return my_list

a = b(a)
print a
错误是:

Traceback (most recent call last):
  File "c.py", line 18, in <module>
    a = b(a)
  File "c.py", line 12, in b
    if not my_list[i]:
IndexError: list index out of range
回溯(最近一次呼叫最后一次):
文件“c.py”,第18行,在
a=b(a)
文件“c.py”,b中第12行
如果不是我的清单[i]:
索引器:列表索引超出范围
那我该怎么办


谢谢

您正在修改循环中迭代的相同列表。您可以通过复制列表并返回以下内容来解决此问题:

def b(my_list):
    new_list = my_list[:]
    for i in range(len(my_list)):
        if not my_list[i]:
            new_list.remove(my_list[i])
        else:
            do_something()
    return new_list

通常在Python中,当调用诸如
b(a)
之类的函数时,在
b
内部,参数
my_list
是对传入的相同列表的引用(
a
)。语句
new\u list=my\u list[:]
复制了列表,您可以在函数中修改并返回该列表。

您正在修改循环中迭代的相同列表。您可以通过复制列表并返回以下内容来解决此问题:

def b(my_list):
    new_list = my_list[:]
    for i in range(len(my_list)):
        if not my_list[i]:
            new_list.remove(my_list[i])
        else:
            do_something()
    return new_list

通常在Python中,当调用诸如
b(a)
之类的函数时,在
b
内部,参数
my_list
是对传入的相同列表的引用(
a
)。语句
new\u list=my\u list[:]
制作了列表的副本,您可以在函数中修改并返回该副本。

我得到的结果是从列表中删除0和None(计算为False的值)。首先,在循环中使用列表时,不要对列表本身进行操作,而是对副本进行操作。此外,您可以在元素上迭代,而不是说索引然后访问它。所以,完成你正在尝试的事情的最好方法就是这样

>>> a=[1,0,None,3]
>>> b = a[:]
>>> for each in a:
...     if not each:
...             b.remove(each)
... 
>>> b
[1, 3]

我得到的结果是,您试图从列表中删除0和None(计算为False的值)。首先,在循环中使用列表时,不要对列表本身进行操作,而是对副本进行操作。此外,您可以在元素上迭代,而不是说索引然后访问它。所以,完成你正在尝试的事情的最好方法就是这样

>>> a=[1,0,None,3]
>>> b = a[:]
>>> for each in a:
...     if not each:
...             b.remove(each)
... 
>>> b
[1, 3]
这也将有助于:

def b(my_list):
   new_list = filter(lambda x: x, my_list) 
   map(do_something, new_list)
   return new_list
这也将有助于:

def b(my_list):
   new_list = filter(lambda x: x, my_list) 
   map(do_something, new_list)
   return new_list

您的代码有两个问题

首先,与C不同,
范围(len(my_list))
表达式只在开始时计算。因此,您将得到4次循环迭代,尽管您的列表越来越短。这就是你“超出范围”错误的原因

第二,当您从列表中删除一个元素时,被删除元素之后的所有元素的索引都将递减。但是您的循环不会考虑这一点,因此实际上将跳过删除的元素之后的元素。例如,看起来您的代码应该删除
0
None
。使用此结构时,
None
将丢失


修复方法是使用Greg所说的副本,或者你可以用计数器和
while
循环来伪造C风格的for循环。

你的代码有两个问题

首先,与C不同,
范围(len(my_list))
表达式只在开始时计算。因此,您将得到4次循环迭代,尽管您的列表越来越短。这就是你“超出范围”错误的原因

第二,当您从列表中删除一个元素时,被删除元素之后的所有元素的索引都将递减。但是您的循环不会考虑这一点,因此实际上将跳过删除的元素之后的元素。例如,看起来您的代码应该删除
0
None
。使用此结构时,
None
将丢失

修复方法是使用格雷格所说的副本,或者你可以用计数器和
while
循环来伪造一个C风格的for循环。

几个例子

重要的概念是切片分配
my_list[:]=new_list
。 这将在列表中提供批量替换

使用切片分配就地更新我的\u列表:

def b(my_list):
    my_list[:] = [ do_something(...) or x for x in my_list if x ]
def b(my_list):
    my_list[:] = filter(None, my_list)
    for x in my_list:
        do_something(...)
def b(my_list):
    new_list = filter(None, my_list)
    for x in new_list:
        do_something(...)
    return new_list
def a(my_list):
    ...
    return my_list # same obj as passed in

my_list = a(my_list)
在这种情况下,do_something()不应返回除None之外的任何内容

过滤然后循环:

def b(my_list):
    my_list[:] = [ do_something(...) or x for x in my_list if x ]
def b(my_list):
    my_list[:] = filter(None, my_list)
    for x in my_list:
        do_something(...)
def b(my_list):
    new_list = filter(None, my_list)
    for x in new_list:
        do_something(...)
    return new_list
def a(my_list):
    ...
    return my_list # same obj as passed in

my_list = a(my_list)
返回新列表:

def b(my_list):
    my_list[:] = [ do_something(...) or x for x in my_list if x ]
def b(my_list):
    my_list[:] = filter(None, my_list)
    for x in my_list:
        do_something(...)
def b(my_list):
    new_list = filter(None, my_list)
    for x in new_list:
        do_something(...)
    return new_list
def a(my_list):
    ...
    return my_list # same obj as passed in

my_list = a(my_list)
警告:这可能导致混淆:

def b(my_list):
    my_list[:] = [ do_something(...) or x for x in my_list if x ]
def b(my_list):
    my_list[:] = filter(None, my_list)
    for x in my_list:
        do_something(...)
def b(my_list):
    new_list = filter(None, my_list)
    for x in new_list:
        do_something(...)
    return new_list
def a(my_list):
    ...
    return my_list # same obj as passed in

my_list = a(my_list)
几个例子

重要的概念是切片分配
my_list[:]=new_list
。 这将在列表中提供批量替换

使用切片分配就地更新我的\u列表:

def b(my_list):
    my_list[:] = [ do_something(...) or x for x in my_list if x ]
def b(my_list):
    my_list[:] = filter(None, my_list)
    for x in my_list:
        do_something(...)
def b(my_list):
    new_list = filter(None, my_list)
    for x in new_list:
        do_something(...)
    return new_list
def a(my_list):
    ...
    return my_list # same obj as passed in

my_list = a(my_list)
在这种情况下,do_something()不应返回除None之外的任何内容

过滤然后循环:

def b(my_list):
    my_list[:] = [ do_something(...) or x for x in my_list if x ]
def b(my_list):
    my_list[:] = filter(None, my_list)
    for x in my_list:
        do_something(...)
def b(my_list):
    new_list = filter(None, my_list)
    for x in new_list:
        do_something(...)
    return new_list
def a(my_list):
    ...
    return my_list # same obj as passed in

my_list = a(my_list)
返回新列表:

def b(my_list):
    my_list[:] = [ do_something(...) or x for x in my_list if x ]
def b(my_list):
    my_list[:] = filter(None, my_list)
    for x in my_list:
        do_something(...)
def b(my_list):
    new_list = filter(None, my_list)
    for x in new_list:
        do_something(...)
    return new_list
def a(my_list):
    ...
    return my_list # same obj as passed in

my_list = a(my_list)
警告:这可能导致混淆:

def b(my_list):
    my_list[:] = [ do_something(...) or x for x in my_list if x ]
def b(my_list):
    my_list[:] = filter(None, my_list)
    for x in my_list:
        do_something(...)
def b(my_list):
    new_list = filter(None, my_list)
    for x in new_list:
        do_something(...)
    return new_list
def a(my_list):
    ...
    return my_list # same obj as passed in

my_list = a(my_list)
@普拉文:这是O(n)。这是一个循环接着另一个循环。不是循环中的循环。@Praveen:这是O(n)。这是一个循环接着另一个循环。不在循环中循环。
do\u something()
是否将列表元素作为输入?
do\u something()
是否将列表元素作为输入?