понимание списка 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
  • Понимание Python-списка в Java
  • список вызовов функции, использующей понимание списка
  • Удалите четное / нечетное число из нечетного / четного списка Python.
  • понимание вложенного списка python
  • Используя понимание списков в Python, чтобы сделать что-то похожее на zip ()?
  • Массивное понимание в JavaScript?
  • Самый быстрый способ преобразования итератора в список
  • Понимание переменных нескольких переменных
  • Транспонирование матрицы в Python
  •  
    Interesting Posts for Van-Lav

    Преобразование нечисловых кортежей в матрицу numpy

    Построение нескольких трехмерных линий: преобразование данных

    Python скрывает тики, но показывает метки ярлыков

    Использование NetworkX с matplotlib.ArtistAnimation

    Как сгенерировать комбинацию строк фиксированной длины с помощью набора символов?

    Что вызывает эту ошибку при попытке установить virtualenv? IOError: Разрешение отклонено: '/Library/Python/2.7/site-packages/virtualenv.py'

    Каков наиболее эффективный способ вставки словарей / списков Python в базу данных SQL?

    Семантика распаковки кортежа в python

    python-mock: параметр «self» отсутствует значение по умолчанию

    Запустите фоновый процесс в Python и НЕ ждите

    django-rest-framework + django-polymorphic ModelSerialization

    автоматически активировать virtualenv в окне терминала PyCharm

    Python – преобразовать строку datetime UTC в локальное время

    pyside – как удалить виджеты из gridLayout

    Как форматировать формат номера оси до тысяч с запятой в matplotlib?

    Python - лучший язык программирования в мире.