python list comprehension在一次迭代中产生两个值

我想在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)]

但是这样做会产生语法错误。

通过列表理解生成上面的列表的一种好方法是什么?

12个解决方案

44 votes

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

Ashwini Chaudhary answered 2020-08-09T21:44:03Z

15 votes

这个问题是古老的,但仅对于好奇的读者,我提出另一种可能性:如第一篇文章所述,您可以轻松地从数字列表中创建一对(i,i ** 2)。 然后,您想弄平这对夫妇。 因此,只需在您的理解中添加扁平化操作即可。

[x for i in range(1, 10) for x in (i,i**2)]

Yann answered 2020-08-09T21:44:23Z

6 votes

一个鲜为人知的技巧:列表推导可以有多个for子句。

例如:

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

Jonathan Mayer answered 2020-08-09T21:44:51Z

5 votes

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

哦,我应该提一下,总和可能会打破一个迭代规则:(

Joran Beasley answered 2020-08-09T21:45:11Z

5 votes

列表理解一次生成一个元素。 您可以选择将循环更改为一次仅生成一个值:

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

Martijn Pieters answered 2020-08-09T21:45:40Z

3 votes

您可以创建一个列表列表,然后使用reduce来加入它们。

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]

Reduce接受一个带有两个参数的可调用表达式,并从前两个项目开始处理一个序列。 然后,最后一个表达式的结果将用作后续调用中的第一项。 在这种情况下,每个列表都一个接一个地添加到列表的第一个列表中,然后作为结果返回该列表。

列表推导使用由“ for var in sequence”表达式定义的变量和序列,使用lambda表达式隐式调用map。 以下是同样的事情。

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表达式。

John Hall answered 2020-08-09T21:46:31Z

2 votes

另一种选择,对于某些人来说似乎是不恰当的

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

iruvar answered 2020-08-09T21:46:51Z

1 votes

另外的选择:

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

Matthew Plourde answered 2020-08-09T21:47:11Z

1 votes

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

Supriya K answered 2020-08-09T21:47:30Z

1 votes

这个线程有很多技巧。 这是另一个使用一个没有进口的班轮发电机

x = (lamdba : [[(yield i), (yield i**2)] for i in range(10)])()

编辑:这将在Python 3.7中引发DeprecatedWarning并在Python 3.8中引发SyntaxError:[https://docs.python.org/dev/whatsnew/3.7.html#deprecated-python-behavior]

Hielke Walinga answered 2020-08-09T21:47:55Z

0 votes

试试这两个衬垫

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

ytpillai answered 2020-08-09T21:48:23Z

0 votes

如前所述,itertools是必经之路。 这是我会做的事情,我发现它更加清楚:

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

ntg answered 2020-08-09T21:48:43Z

python comprehension_python list comprehension在一次迭代中产生两个值相关推荐

  1. python布尔型变量错误的赋值_Python中布尔变量的值为( )

    [单选题]x 的 y 次方(xy) 以下表达式正确的是________ [多选题]以下关于 Python 字符串的描述中,正确的是( ) [多选题]下列表达式的值为False的是( ) [其它]返回 ...

  2. python 打印数组第一行_打印数组中的第一个值而不是只打印第一个字母?(Python)...

    我使用Python将SQLite3数据库中的数据追加到数组中.现在我有了一个数组,我正试图以如下格式打印附加数据:print "Team: " + new_array[0][0] ...

  3. python verilog顶层连线,如何在Verilog中连接两个模块?

    I have written two modules DLatch and RSLatch and i want to write verilog code to join those two. 解决 ...

  4. python提取一行_如何从numpy数组中提取任意一行值?

    @Sven的答案很简单,但对于大型数组来说效率相当低.如果处理的是一个相对较小的数组,则不会注意到差异,如果要从较大的数组(例如50 MB)获取配置文件,则可能需要尝试其他几种方法.不过,您需要在&q ...

  5. python的高级特性:切片,迭代,列表生成式,生成器,迭代器

    python的高级特性:切片,迭代,列表生成式,生成器,迭代器 1 #演示切片 2 k="abcdefghijklmnopqrstuvwxyz" 3 #取前5个元素 4 k[0:5 ...

  6. 【剑指offer 07】用迭代和递归两种方法重构二叉树(python实现)

    本文讲解一个经典的面试题,使用 python 通过迭代和递归两种方法重构二叉树. 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字 ...

  7. python:迭代器对象,迭代器和迭代

    学习目标: 一.了解迭代对象.迭代器和迭代的区别和联系. 二.迭代对象有哪些? 三.关于迭代器和生成器 1. 迭代器的定义: 2. 迭代器的创建: 3. 迭代器的判断. 四.迭代的使用 学习内容: P ...

  8. python——常见内置函数、可迭代对象与迭代器对象

    目录 一.常见内置函数 1.abs() 2.all()与any() 3.bin() oct() hex() 4.int() 5.bytes() 6.callable() 7.chr() ord() 8 ...

  9. Python:实现double factorial iterative双阶乘迭代算法(附完整源码)

    Python:实现double factorial iterative双阶乘迭代算法 def double_factorial(num: int) -> int:if not isinstanc ...

最新文章

  1. poj2976(0-1分数规划)
  2. Python 中常见的 TypeError 是什么?
  3. “cvSnakeImage”: 找不到标识符
  4. C语言中巧妙的使用#和##
  5. Golang中支持可变参数
  6. 妈的我好像发现是哪出问题了
  7. WebDev.WebServer40.exe已停止工作
  8. html资源文件记载进度条,HTML5矢量实现文件上传进度条
  9. myeclipse下使用Junit4进行单元测试
  10. 在 Ubuntu 中使用 GDebi 快速安装 DEB 包
  11. 你很熟悉CSS,却没掌握这些CSS技巧
  12. 短文本相似度比较:simHash简介以及java实现
  13. 华为 android 5.0系统下载地址,Emui5.0+Android 华为Nova内测包
  14. XML学习之应用范围
  15. ubuntu18.04开机后出现黑屏 最上显示/dev/nvme。。。
  16. Arduino LED闪烁
  17. 【File类、递归】
  18. 安卓ndk 忽略 error: undefined reference to '找不到符号
  19. 反汇编和二进制分析工具清单
  20. python1到100奇数相加_Python:从inpu将奇数相加

热门文章

  1. 面试 技术 教训_我如何应用从失败的技术面试中学到的经验教训来获得5个工作机会
  2. Python爬虫Scrapy框架IP代理的配置与调试
  3. 干货 | ZooKeeper 源码和实践揭秘
  4. 原版英文书籍《Linux命令行》阅读记录5 | 使用命令
  5. 漫步线性代数十八——正交基和格拉姆-施密特正交化(下)
  6. leetcode —— 面试题 17.08. 马戏团人塔
  7. leetcode - 898. 子数组按位或操作(使用了集合)
  8. 【差分隐私入门】差分隐私系统学习记录 (一)
  9. 如何在word中像LaTeX一样键入公式
  10. 小波变换(wavelet transform)的通俗解释(三)