У меня есть вопрос об этом коде:
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 предназначен для устранения дубликатов в списке участников, и этот код работает правильно. Однако, если я изменю строку:
prev = poss[0]
к
prev = 0
он не будет корректно удалять их. Для жизни я не могу понять, почему.
Почему бы просто не сделать способ в set удалить дубликаты? Например.
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
для удаления дубликатов. Вы можете удалить часть sorted
, если вам не нужен результат в отсортированном порядке.
Чтобы ответить на ваш вопрос, ваше условие prev == p
во втором for-loop никогда не выполняется, если prev = 0
. Я согласен с другими, которые предложили использовать set()
.
Вы также можете использовать dictionnary для удаления дубликатов (Дополнительная информация):
poss = list({p:None for p in poss}.keys()) # for python 3.x
или
poss = list({}.fromkeys(poss).keys())
Но вам нужно будет отсортировать список снова (так что сортируйте его только один раз, после удаления дубликатов).
poss[0]
равно 6 в вашем примере, поэтому prev = 0
отличается от prev = poss[0]
.