Python:构建一个列表理解来增长lis

2024-06-16 10:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想编写一些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)]

。。。而后续的迭代也不起作用。你知道吗

除了答案,对产生答案的思维过程进行一些解释将是最有帮助的。你知道吗

编辑:如果有人能告诉我为什么我的问题获得了接近的票数,我也会很感激。你知道吗


Tags: 答案代码in目的编辑示例列表for
2条回答

下面是一个使用^{}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]
>>>
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]

相关问题 更多 >