Python 为什么'prev=poss[0]`和'prev=0'的行为不同?
我对该代码有一个问题:Python 为什么'prev=poss[0]`和'prev=0'的行为不同?,python,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
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]
到
它不会正确地删除它们。就我的一生而言,我不明白为什么。为什么不把poss变成一个可以删除重复项的文件呢?例如
poss = set(poss)
为了回答您原来的问题,
prev=poss[0]
与prev=0
不同,因为poss[0]
不是0。为什么不将poss变成一个来删除重复项呢?例如
poss = set(poss)
为了回答您最初的问题,
prev=poss[0]
与prev=0
不同,因为poss[0]
不是0。我很确定您的第二个循环不会删除重复项。我真的不确定它会做什么,因为您正在修改要迭代的列表,并且每次删除时都会跳过值。我建议使用以下任何一种:
# 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
循环来删除重复项。如果不需要排序的结果,可以删除排序的部分。我很确定第二个循环不会删除重复项。我真的不确定它会做什么,因为您正在修改要迭代的列表,并且每次删除时都会跳过值。我建议使用以下任何一种:
# 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
循环来删除重复项。如果不需要按排序的顺序删除结果,则可以删除已排序的部分。也可以使用删除重复项():
或
但是您需要再次对列表进行排序(因此,在删除重复项后,只对其进行一次排序)
poss[0]
在您的示例中是6,因此prev=0
不同于prev=poss[0]
您还可以使用删除重复项():
或
但是您需要再次对列表进行排序(因此,在删除重复项后,只对其进行一次排序)
poss[0]
在您的示例中是6,因此prev=0
不同于prev=poss[0]
要回答您的问题,如果prev=0
,则第二个for循环中的条件prev==p
永远不会满足。我同意其他人建议使用set()
来回答您的问题,如果prev=0
,则第二个for循环中的条件prev==p
永远不会满足。我同意其他人建议使用set()
这段代码的目的是什么?不要改变你正在循环的列表。这肯定会导致混乱。你想用这段代码实现什么?不要改变你正在循环的列表。这肯定会导致混淆。在Python2.x中,字典理解不可用,这似乎是他正在使用的。在Python2.x中,字典理解不可用,这似乎是他正在使用的。
poss = list({}.fromkeys(poss).keys())