我想编写一些将采用现有列表的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)]
...并且后续迭代不起作用。
除了答案之外,对产生答案的思维过程的一些解释将是最有帮助的。
编辑:如果有人能够就我的问题获得近距离投票给我一些见解,我也会感激。
答案 0 :(得分:3)
这是一个非常有效的解决方案,使用itertools.chain.from_iterable
和generator 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]