Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;列表索引超出范围";-python_Python_List_Indexing - Fatal编程技术网

&引用;列表索引超出范围";-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)