到目前为止,在Python中,我只见过列表推导,它指定了一个元素的包含。例如,它们都是以下列形式
[f(x) for x in <iterable>]
有没有办法一次指定多个元素?例如,
[f(x), g(x) for x in <iterable>]
我问是因为我想创建一个列表推导来计算某个数字x的所有除数,但我想尽可能高效地完成这个。现在我正在使用以下内容,
[y for y in range(1,x+1) if x%y == 0]
但是我想做这样的事情,
[y, x/y for y in range(1, sqrt(x)+1) if x%y == 0]
因为这会更有效率。顺便说一下,我没有实际的理由这样做。这只是一个挑战问题,有人告诉我,目标是用最小,最有效的列表理解来实现。
提前致谢。
编辑:好的,看起来我必须使用元组。我试图避免这种情况,尽管我必须制作另一个功能来压扁列表,这会使我的解决方案更长。
编辑2 :万一有人偶然发现这个问题,我原来的问题中我想做的答案是:
[y for x in <iterable> for y in f(x), g(x)]
它在列表推导中使用嵌套for循环来完成工作。
答案 0 :(得分:4)
你可以将它压扁到位
[y if i else x/y for y in range(1, sqrt(x)+1) for i in 0,1 if x%y == 0]
答案 1 :(得分:3)
您可以分配给元组
[(y, x/y) for y in range(1, int(sqrt(x))+1) if x%y == 0]
与您的基本问题并不完全相关,但是您的示例:我必须将range()
的第二个参数转换为int
,因为sqrt()
导致了float
我的测试代码。
更新重新修改:
要展平这个元组列表:
In [24]: s
Out[24]: [(1, 20), (2, 10), (4, 5)]
使用它:
In [25]: import operator
创建一个元组:
In [26]: reduce(operator.add, s, ())
Out[26]: (1, 20, 2, 10, 4, 5)
创建一个列表:
In [27]: list(reduce(operator.add, s, ()))
Out[27]: [1, 20, 2, 10, 4, 5]
注意:在一条有用的评论中,@ jamylak指出reduce
和operator.add
运行订单O(N ^ 2),使用itertools.chain
效率更高。随着列表大小的增加,这变得更加重要,在这种情况下应予以考虑。
答案 2 :(得分:3)
是的,你可以做到。你只需要在元素周围加上括号。你得到的是一个元组列表。
>>> [(x, x+1) for x in range(5)]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
答案 3 :(得分:2)
哦,如此接近:
[(y, x/y) for y in range(1, sqrt(x)+1) if x%y == 0]
可以生成元组列表,这些当然可以包含多个值。
答案 4 :(得分:1)
是绝对的,只需在值周围使用括号:
[(y, x/y) for y in range(1, sqrt(x)+1) if x%y == 0]