Подтвердить что ты не робот

Понимание списка python для создания двух значений на одной итерации

Я хочу сгенерировать список в python следующим образом:

[1, 1, 2, 4, 3, 9, 4, 16, 5, 25 .....]

Вы бы поняли, это ничего, кроме n, n*n

Я попытался написать такое понимание списка в python следующим образом:

lst_gen = [i, i*i for i in range(1, 10)]

Но при этом возникает синтаксическая ошибка.

Что было бы хорошим способом генерировать вышеуказанный список через понимание списка?

4b9b3361

Ответ 1

Используйте itertools.chain.from_iterable:

>>> from itertools import chain
>>> list(chain.from_iterable((i, i**2) for i in xrange(1, 6)))
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25]

Или вы также можете использовать функцию generator:

>>> def solve(n):
...     for i in xrange(1,n+1):
...         yield i
...         yield i**2

>>> list(solve(5))
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25]

Ответ 2

lst_gen = sum([(i, i*i) for i in range(1, 10)],())

oh Я должен упомянуть, что сумма, вероятно, нарушает одно правило итерации: (

Ответ 3

Пояснения к спискам генерируют по одному элементу за раз. Вместо этого ваши параметры меняют ваш цикл, чтобы генерировать только одно значение за раз:

[(i//2)**2 if i % 2 else i//2 for i in range(2, 20)]

или для получения кортежей, затем сгладьте список, используя itertools.chain.from_iterable():

from itertools import chain

list(chain.from_iterable((i, i*i) for i in range(1, 10)))

Вывод:

>>> [(i//2)**2 if i % 2 else i//2 for i in range(2, 20)]
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]
>>> list(chain.from_iterable((i, i*i) for i in range(1, 10)))
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]

Ответ 4

Вы можете создать список списков, а затем использовать сокращение, чтобы присоединиться к ним.

print [[n,n*n] for n in range (10)]

[[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49 ], [8, 64], [9, 81]]

print reduce(lambda x1,x2:x1+x2,[[n,n*n] for n in range (10)])

[0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]

 print reduce(lambda x1,x2:x1+x2,[[n**e for e in range(1,4)]\
 for n in range (1,10)])

[1, 1, 1, 2, 4, 8, 3, 9, 27, 4, 16, 64, 5, 25, 125, 6, 36, 216, 7, 49, 343, 8, 64, 512, 9, 81, 729]

Уменьшение принимает вызываемое выражение, которое принимает два аргумента и обрабатывает последовательность, начиная с первых двух элементов. Результат последнего выражения затем используется как первый элемент в последующих вызовах. В этом случае каждый список добавляется один за другим в первый список в списке списков, а затем в результате возвращается этот список.

Сопоставления списка неявно называют карту с выражением лямбда, используя переменную и последовательность, определяемые выражением " для var в. Следующее - это то же самое.

map(lambda n:[n,n*n],range(1,10))

[[1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64 ], [9, 81]]

Я не знаю более естественного выражения python для уменьшения.

Ответ 5

Другая опция:

reduce(lambda x,y: x + [y, y*y], range(1,10), [])

Ответ 6

Другая опция, может показаться извращенной некоторым

>>> from itertools import izip, tee
>>> g = xrange(1, 11)
>>> x, y = tee(g)
>>> y = (i**2 for i in y)
>>> z = izip(x, y)
>>> output = []
>>> for k in z:
...     output.extend(k)
... 
>>> print output
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100]

Ответ 7

Вопрос старен, но для любознательного читателя я предлагаю другую возможность: Как указано в первом сообщении, вы можете легко сделать пару (i, я ** 2) из ​​списка чисел. Тогда вы хотите сгладить эту пару. Поэтому просто добавьте операцию сглаживания в ваше понимание.
[x for i in range(1, 10) for x in (i,i**2)]

Ответ 8

>>> lst_gen = [[i, i*i] for i in range(1, 10)]
>>> 
>>> lst_gen
[[1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
>>> 
>>> [num for elem in lst_gen for num in elem]
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81]

Вот моя ссылка http://docs.python.org/2/tutorial/datastructures.html

Ответ 9

Попробуйте выполнить два лайнера

lst = [[i, i*i] for i in range(10)]
[lst.extend(i) for i in lst]

Измените математику по мере необходимости.

ДАЖЕ ЛУЧШЕ

#Change my_range to be the number you want range() function of
start = 1
my_range = 10
lst = [i/2 if i % 2 == 0 else ((i-1)/2)**2 for i in range(start *2, my_range*2 - 1)]

Ответ 10

Как уже упоминалось, itertools - это путь. Вот как бы я это сделал, я нахожу это более ясным:

[i if turn else i*i for i,turn in itertools.product(range(1,10), [True, False])]

Ответ 11

Малоизвестный прием трюков: список может содержать несколько предложений.

Например:

>>> [10*x+y for x in range(4) for y in range(3)]
[0, 1, 2, 10, 11, 12, 20, 21, 22, 30, 31, 32]

В вашем конкретном случае вы можете сделать:

>>> [x*x if y else x for x in range(5) for y in range(2)]
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16]