英文:
remove duplicate elements from list without creating new list
问题
我正在尝试使用for循环从列表中删除元素(不创建新列表或使用set()等函数)。
我编写了以下代码,但出现了IndexError: list index out of range。
我错过了什么?
```python
MyList=[1,1,2,3]
for i in MyList:
for j in MyList:
if MyList[i] == MyList[j]:
del MyList[j]
else:
j = j+1
i = i+1
print(MyList)
我期望得到一个没有重复元素的相同列表
<details>
<summary>英文:</summary>
I'm trying to remove an element from a list using for loops (without creating new list or functions like set()..etc)
I wrote the below code but I got: IndexError: list index out of range.
what I missing?
MyList=[1,1,2,3]
for i in MyList:
for j in MyList:
if MyList[i] == MyList[j]:
del MyList[j]
else:
j = j+1
i = i+1
print(MyList)
I expect to get same list without duplicate elements
</details>
# 答案1
**得分**: 2
你之所以出现索引错误是因为你正在使用项目值作为索引。`for i in myList:`将项目值(而不是索引)放入变量`i`中。所以在`MyList[i] == MyList[j]`中使用`i`作为索引是行不通的。
为了获得索引,你需要使用`range()`或`enumerate()`函数(或手动增加一个变量)。
避免在列表迭代中移除项的干扰的一种方法是从后向前工作。
例如(使用你自己的索引变量):
```python
i = len(myList)-1 # 当前项目索引(从最后开始)
for n in reversed(myList): # 反向迭代
if myList.index(n) < i: # 如果n是早期项目的重复项
del myList[i] # 删除重复项
i -= 1 # 上一个索引
另一种方法可能是将不是重复项的项目移到列表开头,并在循环结束时删除额外的位置:
j = 0 # 下一个唯一项目的位置
for n in myList: # 遍历项目
if myList.index(n) >= j: # 尚未在列表开头
myList[j] = n # 将其放在开头
j += 1 # 下一个唯一位置
myList[j:] = [] # 删除额外的空间
英文:
You are getting an indexing error because you are using item values as indexes. for i in myList:
places item values (not indexes) in the i
variable. So using i
as an index in MyList[i] == MyList[j]
cannot work.
In order to get indexes, you need to use the range()
or enumerate()
function (or increase a variable manually).
One way to avoid interference of removals on the list iteration is to work your way backward.
For example (using your own indexing variable):
i = len(myList)-1 # current item index (starting from last)
for n in reversed(myList): # iterate backward
if myList.index(n) < i: # if n is duplicate of earlier item
del myList[i] # remove the duplicate
i -= 1 # previous index
Another approach could be to move items that are not duplicates at the beginning of the list and delete the extra positions at the end of the loop:
j = 0 # next position of unique item
for n in myList: # go through items
if myList.index(n) >= j: # not already at beginning of list
myList[j] = n # place it at beginning
j += 1 # next unique position
myList[j:] = [] # delete extra space
答案2
得分: 0
我希望这对你有用
MyList=[1, 1, 2, 3]
for number in MyList:
repeated = MyList.count(number)
if repeated > 1:
MyList.remove(number)
print(MyList)
结果将会是: [1, 2, 3]
英文:
I hope this works for you
MyList=[1, 1, 2, 3]
for number in MyList:
repeated = MyList.count(number)
if repeated > 1:
MyList.remove(number)
print(MyList)
The result will be: [1, 2, 3]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论