我编写了一个代码,该代码从Python的列表中消除了重复项。在这里:
List = [4, 2, 3, 1, 7, 4, 5, 6, 5]
NewList = []
for i in List:
if List[i] not in NewList:
NewList.append(i)
print ("Original List:", List)
print ("Reworked List:", NewList)
但是输出是:
Original List: [4, 2, 3, 1, 7, 4, 5, 6, 5]
Reworked List: [4, 2, 3, 7, 6]
为什么输出中缺少1
?
答案 0 :(得分:1)
使用set()
取消订单。您可以尝试:
>>> from collections import OrderedDict
>>> NewList = list(OrderedDict.fromkeys(List))
答案 1 :(得分:0)
您没有理解python中for循环的工作方式。如果您写for i in List:
,我将一个接一个地列出列表中的值,因此在您的情况下为4,2,3 ...
我认为您以为它会增加计数。
您有几种不同的方法可以从python列表中删除不需要自己编写的重复项,例如将其转换为集合并返回列表。
list(set(List))
另外,您应该阅读Pep8并以不同的方式命名变量,但这只是顺便说一句。
此外,如果您确实希望使用索引循环,则可以在python中使用枚举。
for idx, value in enumerate(myList):
print(idx)
print(myList[idx])
答案 2 :(得分:0)
您的代码没有按照您认为的做。您的问题是这两个构造:
for i in List: # 1
if List[i] # 2
i
表示列表中的元素:4,2,3,... i
代表列表的索引:0、1、2 ... 显然,1.和2.不兼容。简而言之,您执行的检查与您在列表中输入的内容不同。
您可以通过在两个步骤中一致对待i
来解决此问题:
for i in List:
if i not in NewList:
NewList.append(i)
答案 3 :(得分:0)
您遍历列表的方法不正确。您的代码当前在元素上进行迭代,但是在逻辑中不使用该元素。您的代码不会出错,因为列表的值也恰好是有效的列表索引。
您有几种选择:
在直接迭代列表元素时使用它们:
NewList = []
for el in L:
if el not in NewList:
NewList.append(i)
这通常被认为是反模式,但不是无效的。您可以遍历列表大小的范围,然后使用列表索引:
NewList = []
for idx in range(len(L)):
if L[idx] not in NewList:
NewList.append(i)
在两种情况下,请注意我们如何避免在内置函数后命名变量。请勿使用list
或List
,而可以使用L
。
实现O(1)查找复杂性的哈希算法效率更高。 unique_everseen
文档中有一个itertools
recipe,已在第三方toolz.unique
中复制。这可以通过使用seen
集并在迭代时跟踪项目来实现。
from toolz import unique
NewList = list(unique(L))