2011-05-08 51 views
1

我有一个关于这个代码的问题:为什么`prev = poss [0]`和`prev = 0`有不同的表现?

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 

它将无法正常删除。对于我的生活,我无法弄清楚为什么。

+0

你想用这段代码完成什么? – 2011-05-08 19:41:39

+1

不要改变你正在循环的列表。这只是保证导致混淆。 – 2011-05-08 19:55:11

回答

3

为什么不只是让位置为set删除重复?例如。

poss = set(poss) 

要回答你原来的问题,prev = poss[0]是不一样的,因为prev = 0poss[0]不为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

你也可以使用一个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]不同。

+1

字典解析在Python 2.x中不可用,这正是他使用的。 – Ponkadoodle 2011-05-08 20:01:04

0

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