Как удалить числа из существующего списка, которые не просты - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь передать список чисел в функцию простого числа.Я ожидаю, что он вернет элементы, которые являются простыми, и отбросит те, которые не являются.

Вот код:

def primality(num):
    if num % 2 == 0 and num > 2:
        return False
    return all(num % i for i in range(3, int(math.sqrt(num)) + 1, 2))

Не работает, почему?

nums = [31, 71, 91, 32, 92, 13, 73, 14, 34, 74]
for i, s in enumerate(nums):
    if not primality(nums[i]):
        del nums[i]
print(nums) # it prints [31, 71, 32, 13, 73, 34] which is wrong, 32 and 34 shouldnt be there

Но это работает:

temp = []
for i, s in enumerate(nums):
    if not primality(nums[i]):
        continue
    temp.append(s)
print(temp) # [31, 71, 13, 73] which is correct

Мой вопросочень простой, но я не могу понять, почему первый метод удаления элементов из существующего списка не удаляет все не простые числа?что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Я объясню вам, что выполняется на каждой итерации цикла for вашего исходного кода:

  • Итерация 1: i = 0, s = 31: число не изменяется
  • Итерация 2: i = 1, s = 71: числа не изменены
  • Итерация 3: i = 2, s = 91: числа изменены
    ==> «91» удалено и так далееэлементы смещены влево
    ==> nums = [31, 71, 32, 92, 13, 73, 14, 34, 74]
  • Итерация 4: i = 3, s = 92 : числа изменены
    ==> "92" - этоудаляются, поэтому следующие элементы смещены влево
    ==> nums = [31, 71, 32, 13, 73, 14, 34, 74]
  • Итерация 5: i = 4, s = 73 : числа не изменены
  • Итерация 6: i = 5, s = 14 : числа изменены
    ==> "14" удалено, поэтому следующие элементы смещены влево
    ==> nums = [31, 71, 32, 13, 73, 34, 74]
  • Итерация 7: i = 6, s = 74 : числа изменены
    ==> "74" удалено
    ==> nums = [31, 71, 32, 13, 73, 34]

Итак, наконец, у вас есть: nums = [31, 71, 32, 13, 73, 34]

Вывод: «Не изменяйте объект во время итерации по нему» будетхорошее сообщение домой.

0 голосов
/ 25 мая 2018

В цикле len (nums) меняется!Таким образом, указатель я не является основным.После первого и второго лупов для чисел [] то же самое.Время nums [] изменяется, так как nums [2] 91 удаляется!Теперь nums [3] - это не 32, а 92, а 92 удалено, если вы хотите исключить 32.

nums = [31, 71, 91, 32, 92, 13, 73, 14, 34, 74] // del i[2] = 91
nums = [31, 71, 32, 92, 13, 73, 14, 34, 74]     // del i[3] = 92
nums = [31, 71, 32, 13, 73, 14, 34, 74]         // del i[4] = 73 
nums = [31, 71, 32, 13, 73, 14, 34, 74]
0 голосов
/ 25 мая 2018

Удаление элемента во время его итерации приводит к такого рода ошибкам.

Одним из подходов здесь может быть создание нового списка с выбранным ограничением:

nums = [31, 71, 91, 32, 92, 13, 73, 14, 34, 74]
prims = [n for n in nums if primality(n)]
# returns : [31, 71, 13, 73]
...