我发现这个问题离我的问题很近:
Adding two items at a time in a list comprehension
但如果我需要在单人间或双人间切换,比如:
original = list(range(10))
required = [0,0,1,2,2,3,4,4,5,6,6,7,8,8,9]
attempt1 = sum([[x,x] if x%2 == 0 else [x] for x in original],[])
attempt2 = [i for x in original for i in ([x,x] if x%2 == 0 else [x])]
sum
似乎是slow,列表理解很难阅读。它们都不能让我感觉简单和美好。你知道吗
有更好的方法吗?还是放弃单行道?或者说服我其中一个是不是真的很好的风格。你知道吗
简单易读的解决方案如下所示:
输出:
就我个人而言,只要我在理解中有更多的非琐碎的东西(例如2
for
和1if
),我就会使用生成器函数。你知道吗例如,在您的案例中,您可以使用(我认为它更具可读性,但这可能是主观的):
试运行:
请注意,这种方法甚至可以更快(它比答案中的其他解决方案快3倍,比你在我的电脑上的理解快2倍)。从this answer获取计时框架:
此图绘制了与我的解决方案相比的相对时间差。请注意,x轴(大小)是对数的,而y轴(时差)不是
你在正确的轨道上。您可以通过在list comp中用
*
操作替换和if..else
来进行简化。你知道吗这大致可以理解为:
或者,您可以创建一个列表列表并使用
itertools.chain.from_iterable
将其展平:感谢评论中的人对重构这些解决方案的帮助。你知道吗
相关问题 更多 >
编程相关推荐