Почему `prev = poss [0]` и prev = 0 ведут себя по-разному?

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 предназначен для устранения дубликатов в списке участников, и этот код работает правильно. Однако, если я изменю строку:

prev = poss[0]

к

prev = 0

он не будет корректно удалять их. Для жизни я не могу понять, почему.

  • 0
    Что вы пытаетесь достичь с помощью этого кода?
  • 1
    Не изменяйте список, который вы просматриваете. Это гарантированно приведет к путанице.
Теги:

4 ответа

3
Лучший ответ

Почему бы просто не сделать способ в set удалить дубликаты? Например.

poss = set(poss)

Чтобы ответить на ваш исходный вопрос, prev = poss[0] не совпадает с prev = 0, потому что poss[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, если вам не нужен результат в отсортированном порядке.

0

Чтобы ответить на ваш вопрос, ваше условие prev == p во втором for-loop никогда не выполняется, если prev = 0. Я согласен с другими, которые предложили использовать set().

-3

Вы также можете использовать 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].

  • 1
    Понимание словаря недоступно в Python 2.x, что, по-видимому, он и использует.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню