为什么`prev = poss [0]`和`prev = 0`表现不一样?

时间:2011-05-08 19:37:24

标签: python

我对此代码有疑问:

    poss = [6,9,20]

for n in range(6,66):
    if(n%6) == 0 or (n%9) == 0 or (n%20) == 0:
        poss.append(n)
poss.sort()
count = 0
prev = poss[0] 

for p in poss:
    print p
    if prev == p:
        del poss[count]
    count += 1
    prev = p

print poss

第二个for循环旨在消除poss列表中的重复项,此代码正常工作。但是,如果我更改了行:

prev = poss[0]

prev = 0

它不会正确删除它们。对于我的生活,我无法弄清楚为什么。

4 个答案:

答案 0 :(得分:4)

我很确定你的第二个循环不会删除重复项。我真的不确定它会做什么,因为你正在修改你正在迭代的列表并在每次删除时跳过值。我建议使用以下任何一种方法:

# this is the same list w/o duplicates, this can replace the entire snippet
poss = [ n for n in range(6, 66) if (n % 6) == 0 or (n % 9) == 0 or (n % 20) == 0 ]

# transform your input list into a set to remove dups
poss = list(sorted(set(poss))

无需for循环删除重复项。如果您不需要按排序顺序排列结果,则可以删除sorted部分。

答案 1 :(得分:3)

为什么不在set中删除重复内容? E.g。

poss = set(poss)

要回答原始问题,prev = poss[0]prev = 0不同,因为poss[0]不是0。

答案 2 :(得分:0)

要回答您的问题,如果prev == p,则永远不会遇到第二个for循环中的条件prev = 0。我同意其他建议使用set()的人。

答案 3 :(得分:-2)

您还可以使用dictionnary删除重复项(More info):

poss = list({p:None for p in poss}.keys()) # for python 3.x

poss = list({}.fromkeys(poss).keys())

但是您需要再次对列表进行排序(因此,在删除重复项后,只需对其进行一次排序)。

您的示例中

poss[0]为6,因此prev = 0prev = poss[0]不同。