Python:构建一个增加列表的列表理解

时间:2013-11-19 18:10:23

标签: python list-comprehension

我想编写一些将采用现有列表的python,并为原始中的每个条目创建一个包含两个条目的新列表。

示例:每个条目都应生成两个新条目:x + 1和3x。

a = [1]
a = [2, 3]
a = [3, 6, 4, 9]
a = [4, 9, 7, 18, 5, 12, 10, 27]

可以输入什么代码来产生所需的输出:

a = [1]
for i in range(3):
    a = ???

我试过了:

a = [(x+1, 3*x) for x in a]

...但这是不正确的,因为第一次迭代给出了一个包含单个元组的列表:

a = [(2, 3)]

...并且后续迭代不起作用。

除了答案之外,对产生答案的思维过程的一些解释将是最有帮助的。

编辑:如果有人能够就我的问题获得近距离投票给我一些见解,我也会感激。

2 个答案:

答案 0 :(得分:3)

这是一个非常有效的解决方案,使用itertools.chain.from_iterablegenerator expression

>>> from itertools import chain
>>> a = [1]
>>> list(chain.from_iterable((x+1, x*3) for x in a))
[2, 3]
>>> a = [2, 3]
>>> list(chain.from_iterable((x+1, x*3) for x in a))
[3, 6, 4, 9]
>>> a = [3, 6, 4, 9]
>>> list(chain.from_iterable((x+1, x*3) for x in a))
[4, 9, 7, 18, 5, 12, 10, 27]
>>>

提供的链接应解释除list(...)部分以外的所有内容。我做到了,所以结果是列表而不是<itertools.chain object at 0x01815370>


编辑以回复评论:

是的,您可以根据需要链接尽可能多的chain objects,然后将整个内容转换为最终列表。请参阅下面的演示:

>>> a = [3, 6, 4, 9]
>>> list(chain.from_iterable((chain.from_iterable((x+1, x*3) for x in a), chain.from_iterable((x+1, x*3) for x in a))))
[4, 9, 7, 18, 5, 12, 10, 27, 4, 9, 7, 18, 5, 12, 10, 27]
>>>

答案 1 :(得分:1)

def somefunc(n):
  if not n:
    return [1]
  else:
    return list(itertools.chain.from_iterable([(i+1, 3*i) for i in somefunc(n-1)]))

输出:

In [20]: somefunc(3)
Out[20]: [4, 9, 7, 18, 5, 12, 10, 27]

In [21]: somefunc(2)
Out[21]: [3, 6, 4, 9]

In [22]: somefunc(1)
Out[22]: [2, 3]