在列表理解中省略值,而不是使用虚拟值

Omitting values in a list comprehension, instead of using dummy values

我的代码:

new_list = [
    num * 0.99 if num > 40 else num * 2 if 20 < num > 30 else "delete" 
    for num in range(50)
]
print(new_list)

我怎样才能同时执行这两个条件并且代码在不包括最后一个条件的情况下也能正常工作?

意思是所有提前得到“delete”值的号码都不会添加到新的列表中,只会添加满足前两个条件的号码。

输出将是:

[
    62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 
    40.589999999999996, 41.58, 42.57, 43.56,
    44.55, 45.54, 46.53, 47.519999999999996,
    48.51
]

而不是:

[
    'delete', 'delete', 'delete', 'delete', 'delete',
    'delete', 'delete', 'delete', 'delete', 'delete',
    'delete', 'delete', 'delete', 'delete', 'delete',
    'delete', 'delete', 'delete', 'delete', 'delete',
    'delete', 'delete', 'delete', 'delete', 'delete',
    'delete', 'delete', 'delete', 'delete', 'delete',
    'delete', 62, 64, 66, 68, 70, 72, 74, 76, 78, 80,
    40.589999999999996, 41.58, 42.57, 43.56, 44.55,
    45.54, 46.53, 47.519999999999996, 48.51
]

如果我没有正确理解你的问题,你想通过 if num > 30:

来限制列表理解
new_list = [
    num * 0.99 if num > 40 else num * 2 for num in range(50) if num > 30
]
print(new_list)

打印:

[62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 40.589999999999996, 41.58, 42.57, 43.56, 44.55, 45.54, 46.53, 47.519999999999996, 48.51]

您有两个选择:

  • 使用循环过滤器; if <test> 部分出现在 之后 列表理解的 for 循环部分
  • 在您的 range() 中使用起始值; range(31, 50) 只给你数字 31 到 49。

过滤器部分看起来像:

new_list = [
    num * 0.99 if num > 40 else num * 2 
    for num in range(50)
    if num > 30
]

一个列表理解有一个表达式,后跟至少一个for循环,但在第一个循环之后可以有任意数量的 if 过滤器表达式,限制实际用于生成值的循环迭代次数。

value 部分使用 conditional expression 没问题,但这样的表达式总是会输出 something.

在这种特定情况下,使用更有针对性的 range():

会更简单
new_list = [
    num * 0.99 if num > 40 else num * 2 
    for num in range(31, 50)
]

如果您的 Python 版本 (3.8+) 支持,您可以使用 := 运算符:

new_list = [ 
    v for num in range(50)
    if (v := num * 0.99 if num > 40 else num * 2 if 20 < num > 30 else "delete") != "delete"
]

None 而不是 "delete" 会是更好的选择。