列出重复删除问题?

时间:2018-08-31 08:12:43

标签: python list

我编写了一个代码,该代码从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

4 个答案:

答案 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
  1. 这里您使用i表示列表中的元素:4,2,3,...
  2. 您在这里使用i代表列表的索引:0、1、2 ...

显然,1.和2.不兼容。简而言之,您执行的检查与您在列表中输入的内容不同。

您可以通过在两个步骤中一致对待i来解决此问题:

for i in List:
    if i not in NewList:
         NewList.append(i)

答案 3 :(得分:0)

您遍历列表的方法不正确。您的代码当前在元素上进行迭代,但是在逻辑中不使用该元素。您的代码不会出错,因为列表的值也恰好是有效的列表索引。

您有几种选择:

#1直接遍历元素

在直接迭代列表元素时使用它们:

NewList = []
for el in L:
    if el not in NewList:
        NewList.append(i)

#2遍历列表索引

这通常被认为是反模式,但不是无效的。您可以遍历列表大小的范围,然后使用列表索引:

NewList = []
for idx in range(len(L)):
    if L[idx] not in NewList:
        NewList.append(i)

在两种情况下,请注意我们如何避免在内置函数后命名变量。请勿使用listList,而可以使用L

#3 unique_everseen

实现O(1)查找复杂性的哈希算法效率更高。 unique_everseen文档中有一个itertools recipe,已在第三方toolz.unique中复制。这可以通过使用seen集并在迭代时跟踪项目来实现。

from toolz import unique

NewList = list(unique(L))