[英]List comprehension in nested ifs
我是一个新手,试图了解 python 中的列表理解。我的问题与其他帖子不同。
我被要求编写列表理解代码以获得以下 output:
从 1 到 30(包括两者)的所有奇数。 那些是 5 的倍数的将标有“x”。
[1, 3, '5x', 7, 9, 11, 13, '15x', 17, 19, 21, 23, '25x', 27, 29]
为此,我尝试使用正常的 for 和 if 方法来获取它。 这是我的解决方案并且有效:
odds = []
for i in list(range(1,30+1)):
if i%2 !=0:
odds.append(i)
if i%5 == 0:
odds.append(f'{i}x')
odds.remove(i)
print(odds)
在图像中,您可以找到我失败的列表理解尝试。 我需要一些光来正确放置 rest 的东西。
谢谢!
您不能单独使用列表理解在一行中解决这个问题。 您需要三元运算符(括在括号中)。
[(n if n%5 else f'{n}x') for n in range(1,31) if n%2]
如果您不关心项目的顺序,则可以通过连接两个列表理解产生的列表来避免需要三元运算符( 条件表达式),例如
[n for n in range(1,31,2) if n%5 != 0] + [f'{n}x' for n in range(1,31,2) if n%5 == 0]
...产生:
[1, 3, 7, 9, 11, 13, 17, 19, 21, 23, 27, 29, '5x', '15x', '25x']
或者,冒着使它看起来像代码高尔夫的风险:
[[f'{n}x',n][min(n%5,1)] for n in range(1,31,2)]
... 产生:
[1, 3, '5x', 7, 9, 11, 13, '15x', 17, 19, 21, 23, '25x', 27, 29]
我使用表达式min(n%5,1)
来索引列表[f'{n}x',n]
,因此 select 列表中的项目 0 或项目 1,具体取决于n
是否可以被 5 整除or not - 也不使用条件表达式。
替代解决方法:
numlist = [(i,f'{i}x')[not i%5] for i in range(31) if i%2]
print(numlist)
# [1, 3, '5x', 7, 9, 11, 13, '15x', 17, 19, 21, 23, '25x', 27, 29]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.