如何从一个列表中删除相同的值以及如何自动更改范围
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 个元素有一个重复,所以循环不会超出范围。
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 个元素有一个重复,所以循环不会超出范围。