&引用;列表索引超出范围";-python
我试图编写一个程序来删除列表中的任何重复项,但我得到的&引用;列表索引超出范围";-python,python,list,indexing,Python,List,Indexing,我试图编写一个程序来删除列表中的任何重复项,但我得到的列表索引超出了范围 代码如下: a_list = [1, 4, 3, 2, 3] def repeating(any_list): list_item, comparable = any_list, any_list for x in any_list: list_item[x] comparable[x] if list_item == comparable:
列表索引超出了范围
代码如下:
a_list = [1, 4, 3, 2, 3]
def repeating(any_list):
list_item, comparable = any_list, any_list
for x in any_list:
list_item[x]
comparable[x]
if list_item == comparable:
any_list.remove(x)
print(any_list)
repeating(a_list)
所以我的问题是,出了什么问题?解决问题的最简单方法是将列表转换为集合,然后再转换回列表
def repeating(any_list):
print list(set(any_list))
您可能遇到了一个问题,因为您在对列表进行迭代时正在修改列表(删除)。您的代码没有执行您认为的操作 首先,在此处创建对同一列表的其他引用:
list_item, comparable = any_list, any_list
list\u item
和comparable
只是访问同一列表对象的附加名称
然后在任意\u列表中包含的值上循环:
for x in any_list:
这首先将1
,然后将4
,然后将3
,然后将2
,然后将3
再次分配给x
接下来,将这些值用作列表的其他两个引用的索引,但忽略这些表达式的结果:
list_item[x]
comparable[x]
除了测试这些索引是否存在之外,这不会做任何事情
下面的一行总是正确的:
if list_item == comparable:
因为这两个变量引用同一个列表对象
因为这总是正确的,所以始终执行以下行:
any_list.remove(x)
这将从列表中删除第一个x
,使列表更短,同时仍在迭代。这会导致for
循环跳过项目,因为它会将指针移动到下一个元素。看看这是为什么
总之,列表中有4项,然后是3项,因此list\u item[3]
会失败并抛出异常
删除重复项的正确方法是使用:
因为集合
只能保存唯一的项。不过,它会改变顺序。如果订单很重要,您可以使用:
像集合
,字典只能保存唯一的键,但有序的dict
实际上也会记录插入顺序;dict.fromkeys()
方法为any\u列表中的每个元素提供一个None
值,除非该元素已经存在。将其返回到列表中,将以先到先得的顺序为您提供独特的元素:
>>> from collections import OrderedDict
>>> a_list = [1, 4, 3, 2, 3]
>>> list(set(a_list))
[1, 2, 3, 4]
>>> list(OrderedDict.fromkeys(a_list))
[1, 4, 3, 2]
有关更多选项,请参见。如果要删除列表中的重复项,但不关心元素格式,则可以
def removeDuplicate(numlist):
return list(set(numlist))
如果你想维持秩序的话
def removeDuplicate(numlist):
return sorted(list(set(numlist)), key=numlist.index)
您认为在这种情况下,x
是什么?此外,将列表分配给另一个名称不会创建副本,只会向该列表添加另一个引用。您的相等性测试将始终为true,因此项目将被删除,索引将不再有效。您甚至不知道python中的for循环。。。首先抓起一本教科书。所以,list\u item==comparable
总是正确的。一般来说,不要真正理解这一点。
def removeDuplicate(numlist):
return list(set(numlist))
def removeDuplicate(numlist):
return sorted(list(set(numlist)), key=numlist.index)