#python
#python
Вопрос:
Пытаюсь разобраться в понимании списков и работе со списком в операциях списка в python.
Из этого руководства http://www.secnetix.de/olli/Python/list_comprehensions .hawk Я не могу понять, что происходит в первой строке.
>>> noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
>>> primes = [x for x in range(2, 50) if x not in noprimes]
>>> print primes
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
Итак, я поместил строку в pythontutor, чтобы визуализировать ее. Итак, я вижу, что для каждого значения i, j оно идет (2,4) (2,6) (2, 8) затем (3,6) (3, 9) (3, 12) и т.д., но я не могу понять в предложении, что именно происходит.
Заставить список работать на меня — мой большой камень преткновения в получении высокой полезности, я просто не могу заставить его работать, он просто не «читается» для меня.
Комментарии:
1. Это причудливый однострочник для сита Эратосфена en.wikipedia.org/wiki/Sieve_of_Eratosthenes
Ответ №1:
Строка
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
эквивалентно:
noprimes = []
for i in range(2,8):
for j in range(i*2, 50, i):
noprimes.append(j)
и строка
primes = [x for x in range(2, 50) if x not in noprimes]
эквивалентно:
primes=[]
for x in range(2,50):
if x not in noprimes:
primes.append(x)
Обновление в ответ на комментарий
Строки
for j in range(i*2, 50, i):
noprimes.append(j)
сгенерируйте последовательность чисел. Начальное число равно 2*i
, приращение равно i
, и последовательность останавливается до того, как оно достигнет или превысит 50
.
Когда i = 2
он генерирует последовательность чисел 4 6 8 ... 48
Когда i = 3
он генерирует последовательность чисел 6 9 12 ... 48
и т.д.
Весь цикл генерирует следующие числа
4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 10, 15, 20, 25, 30, 35, 40, 45, 12, 18, 24, 30, 36, 42, 48, 14, 21, 28, 35, 42, 49
Комментарии:
1. j в диапазоне (i * 2, 50, i) итак, что именно происходит, что находит j.
Ответ №2:
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
Это эквивалентно следующему:
noprimes = []
for i in range(2, 8):
for j in range(i*2, 50, i):
noprimes.append(j)
Ответ №3:
Сначала он создает noprimes
, который представляет собой список составных чисел. i
диапазон от 2 до 7. Когда i
равно 2, j
выполняется итерация по 4, 6, 8 и т.д.; кратно 2, но исключая 2. Когда i
равно 3, j
равно 6, 9, 12 и т.д. В noprimes
итоге получается все составные числа до 49 (некоторые из них несколько раз).
Затем primes
просто берет все числа от 2 до 49, которых нет noprimes
.