列表理解一次将奇数加两次

Dee*_*Kay 7 python arrays list-comprehension list

我正在学习列表理解的过程,偶然发现一种无法找到足够理解资源的问题。

问题源于以下问题:我们有一个数组[1,2,3,8,9],想要创建一个表达式,该表达式将每个奇数返回两次,而偶数仅返回一次。

注意:还有一个提示,我可以创建嵌套列表,但是到目前为止,这并没有帮助我确定如何为我服务。

适当算法的输出应为:[1,1,2,3,3,8,9,9]

使用循环,我可以这样做:

OtherNumList = [1, 2, 3, 8, 9]
OtherNumList2 = []
for i in OtherNumList:
    if i%2==1:
        OtherNumList2.append(i)
        OtherNumList2.append(i)
    else:
        OtherNumList2.append(i)
print(OtherNumList2)
Run Code Online (Sandbox Code Playgroud)

我只想使用一个表达式来执行此操作,或者使用列表推导来“单行”执行此操作。

我正在努力理解如何将理解力设置为如果X追加两次,而如果Y追加一次。

非常感谢您的帮助,即使您只是理解理解的概念;我不希望采用汤匙喂食的解决方案,如果您可以引导我完成自己的思考过程,以便将来能更好地为自己的列表理解打下更好的基础,我宁愿选择它。:)

Sha*_*ger 10

您可以在没有外部工具的情况下一次完成列表理解。您只需要根据从外部序列中拉出的值来制作和遍历内部值序列:

OtherNumList = [1, 2, 3, 8, 9]
OtherNumList2 = [rep for i in OtherNumList for rep in (i,)*(i%2+1)]
print(OtherNumList2)
Run Code Online (Sandbox Code Playgroud)

第二招for。根据是偶数(一个副本)还是奇数(两个副本),对tuple的一两个副本进行迭代。方便地,我们甚至不需要在这里进行真正的布尔检查。永远都是偶数和奇数,因此我们可以使用它直接相乘。然后直接产生正确次数的结果值,而无需额外的展平。ii(i%2+1)12

  • @Prerit:是的,尽管保证内部循环精确地运行1或2次,所以它不会影响big-O的运行时间。列表推导中可以包含任意数量的循环,其中最左边的循环最慢,最右边的循环最快。没有解决方案,不涉及单独的生成器函数或显式的“ append”,都无法避免第二个循环(即使对于那些循环,实际上也只是一个展开的循环);它可能隐藏在“链条”之类的东西中,但是会发生。 (3认同)