如何使用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()
是否将列表元素作为输入?