繁体   English   中英

嵌套 ifs 中的列表理解

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM