понимание списка 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)] 

Но делая это, дает синтаксическую ошибку.

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

11 Solutions collect form web for “понимание списка python для создания двух значений на одной итерации”

Используйте 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] 

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

 >>> 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] 
 lst_gen = sum([(i, i*i) for i in range(1, 10)],()) 

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

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

 [(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] 

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

 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, 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]

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

Перечисления списков неявно называют карту с выражением лямбда, используя переменную и последовательность, определяемые выражением « for var in sequence». Следующее – это то же самое.

 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 для уменьшения.

Другой вариант:

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

Другой вариант, может показаться порочным для некоторых

 >>> 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] 

Вопрос старый, но для любознательного читателя я предлагаю другую возможность: как указано в первом посте, вы можете легко сделать пару (i, i ** 2) из ​​списка чисел. Тогда вы хотите сгладить эту пару. Поэтому просто добавьте операцию сглаживания в ваше понимание.

 [x for i in range(1, 10) for x in (i,i**2)] 
 >>> 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

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

 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)] 

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

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

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

Например:

 >>> [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] 
  • Автоматическое упрощение / рефакторинг кода Python (например, для циклов -> понимание списка)?
  • Элементы sum в списке python только в том случае, если элементы в отдельном булевом списке True
  • Python - поиск инкрементных нумерованных последовательностей с пониманием списка
  • понимание вложенного списка python
  • Понимание списка Python с уникальными элементами
  • Транспонирование матрицы в Python
  • Поиск простых чисел с использованием списка
  • Что означает «понимание списка»? Как это работает и как я могу его использовать?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.