如何从一个列表中删除相同的值以及如何自动更改范围

How to remove same value from one list and how to change ranges automatically

def my_list(enter_list): 
    #print(len(enter_list))--> 7 element
    for i in range(0, len(enter_list)): # THE PROBLEM IS HERE
        count = enter_list.count(enter_list[i])  
        if count >=2:
            enter_list.pop(i)
    return enter_list

print(my_list(["purple","coffee",2,6,2,"purple","steak"]))

起初我的列表中有 7 个值。但是在我从我的列表中删除一个相同的值之后,我的列表的值正在减少。 İf 我像这样更改范围 range(0,len(enter_list)-2)。有用。我不知道如何自动更改范围。 (我可以手动更改范围,但它不会每次都有效。)

['coffee', 6, 2, 'purple', 'steak']

这是我手动更改范围时的输出。

与其尝试修改您正在迭代的范围,我建议您创建一个 enter_list 列表的副本,然后从该列表中弹出()元素。这样您将遍历完整的项目列表,但您将 return 列表的修改版本,而不必动态更改循环的范围,我认为这是不可能的。

快速展示代码中的技巧:

def my_list(enter_list): 
    
    output_list = enter_list.copy()
    for i in range(0, len(enter_list)):
        count = enter_list.count(enter_list[i])  
        if count >=2:
            output_list.pop(i)

    return output_list

这里是 return output_list,这将是您的过滤版本,但通过复制 enter_list,您可以确保迭代完整集。

补充一下:在这里使用 pop(i) 可能会导致您在接近循环末尾时弹出超出范围的内容,因此这种遍历元素的循环可能效果最好:

for items in enter_list:
    output_list.pop(item)

然后你确保你不会在超出范围的索引上 pop()。

你可以这样做:

def my_list(lst): 
    i = 0
    while True:
        cnt = lst.count(lst[i])  
        if cnt > 1:
            lst.pop(i)
        i += 1
        if len(lst) == i:
            break
    return lst

print(my_list(["purple","coffee",2,6,2,"purple","steak"]))

输出

['coffee', 6, 2, 'purple', 'steak']

您的方法的问题在于,在 for 循环中,列表的 len 仅在开始时评估一次。之所以减少 2 使其起作用,是因为有 2 个元素有一个重复,所以循环不会超出范围。