使用pop方法删除列表中的重复元素



我尝试了下面的代码来删除下面的代码以删除列表中的重复项,但它给了我一个错误:列表索引超出范围。

l1=[8,32,33,21,98,3,21,32,89,45,34,33,90,33,21,34,33]
print('Original List:',l1)
i=0
while i <len(l1):
no=l1[i]
for x in range(i+1,len(l1)):
val=l1[x]
if val==no:
l1.pop(x)
i+=1
print('List after removing duplicate items is: ',l1)

请帮助我的错误,我如何纠正错误

它抛出错误的原因是因为您的内部循环只设置了一次长度。因此,一旦您开始删除项,它的长度就会比它尝试迭代的长度短。您可以尝试将内部循环更改为while循环。但一种更像蟒蛇的方式是使用循环。

但考虑到你只是在元素上使用简单的等式比较,为什么不试试这个呢。

l1 = list(dict.fromkeys(l1))

dict.fromkeys创建一个字典,其中键设置为第一个参数的值,然后默认情况下将值设置为None。因此,基本上它输出:{8: None, 32: None, 33: None, 21: None, 98: None, 3: None, 89: None, 45: None, 34: None, 90: None}

由于字典不能有重复的关键字,所以重复的关键字就消失了。

然后对其调用list(),通过使用新字典的键作为值将其转换为列表。

如果你必须用循环来做,你可以尝试并建设性地做:

l1=[8,32,33,21,98,3,21,32,89,45,34,33,90,33,21,34,33]
print('Original List:',l1)
new_list = []
for x in l1:
if x not in new_list:
new_list.append(x)
print('List after removing duplicate items is: ', new_list)

但是如果你真的必须使用pop()和循环。你可以这样做:

for i, x in reversed(list(enumerate(l1))): #loop through the list from the end (with the index of that item)
if l1.count(x) > 1: # if there is more than one of that element in the list, pop the last element you tested.
l1.pop(i)

如果顺序无关紧要,我的方法是使用集合:l1 = list(set(l1))

下面的程序将给出两个列表的非交互,并删除重复项。使用append&pop方法都有解释。

def list_nonintersection(list1, list2):
nonintersection_list = []
for x in list1:
if x not in list2:
nonintersection_list.append(x)
for x in list2:
if x not in list1:
nonintersection_list.append(x)
#return nonintersection_list
# final_list =[]
# for x in nonintersection_list:
#     if x not in final_list:
#         final_list.append(x)
# return final_list
i = 0
while(i < len(nonintersection_list)):
elem = nonintersection_list[i]
new_length = len(nonintersection_list)
for x in range(i+1, new_length-1):
if nonintersection_list[x] == elem:
nonintersection_list.pop(x)
i+=1
return nonintersection_list

相关内容

  • 没有找到相关文章

最新更新