列表理解Python中的嵌套控制流

问题描述 投票:0回答:4

如何使用嵌套的if语句将此for循环转换为列表解析?

stock = []
for i in range(10):
     if i <= 5:
         trade = "buy"
     elif i > 5 and i <= 7:
         trade = "hold"

         if i == 6:
             trade = "short-sell"

     else:
          trade = "sell"
     stock.append(trade.capitalize())
stock

['买','买','买','买','买','买','卖空','持有','卖','卖']

我到目前为止最好的是:

["Buy" if i <= 5 else  "Hold" if i > 5 and i <= 7  else "Sell"
 for i in range(10)]

['买','买','买','买','买','买','持有','持有','卖','卖']

任何帮助将完全赞赏! :)

python for-loop nested list-comprehension control-flow
4个回答
2
投票

你错过了i == 6案。尝试

["Buy" if i <= 5 else  "Short-sell" if i == 6 else "Hold" if  i <= 7  else "Sell" for i in range(10)]

这给了我们

['Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'Short-sell', 'Hold', 'Sell', 'Sell']

但是,这样做是没有充分理由的。它并不容易阅读(如你所见)很容易忽视错误。如果我是你,我会坚持你的原始模式(你在这里发布的代码虽然不太合适)


2
投票

以下是各种条件语句的等效表达式:

['buy' if i <=5 else (('short-sell' if i == 6 else 'hold') if i > 5 and i <= 7 else 'sell') for i in range(10)]

在行动:

In [10]: ['buy' if i <=5 else (('short-sell' if i == 6 else 'hold') if i > 5 and i <= 7 else 'sell') for i in range(10)]
Out[10]:
['buy',
 'buy',
 'buy',
 'buy',
 'buy',
 'buy',
 'short-sell',
 'hold',
 'sell',
 'sell']

注意,在这种情况下,嵌套的if语句相当于:

if i == 6:
    trade = "short-sell"
else:
    trade = "hold"

注意,不要使用这个简洁的嵌套条件表达式。这是让你在代码审查中被侮辱的事情。只需使用for循环。如果你有使用理解的强烈愿望,那么使用完整的嵌套条件语句将条件逻辑放入函数中,例如:

In [14]: def f(i):
    ...:      if i <= 5:
    ...:          trade = "buy"
    ...:      elif i > 5 and i <= 7:
    ...:          trade = "hold"
    ...:
    ...:          if i == 6:
    ...:              trade = "short-sell"
    ...:
    ...:      else:
    ...:           trade = "sell"
    ...:      return trade
    ...:

In [15]: [f(i) for i in range(10)]
Out[15]:
['buy',
 'buy',
 'buy',
 'buy',
 'buy',
 'buy',
 'short-sell',
 'hold',
 'sell',
 'sell']

1
投票

这是一种非常不同的方法:

action_tests = [
    ('buy', lambda x: x <= 5),
    ('hold', lambda x: (5 < x <= 7) and (x != 6)),
    ('short-sell', lambda x: x == 6),
]

stock = [next((action for action, test in action_tests if test(i)), 'sell') for i in range(10)]

在没有任何测试为next返回true的情况下,“else”条件由action_tests的默认值处理。

你真的不想将所有复杂的逻辑压缩成一行,因为它会使可维护性成为一场噩梦 - 很难检测到错误,甚至在规范发生变化时更难以添加更多逻辑。

如果if语句易于扩展,这种方法比原始集合有所改进......只需按照适当的优先级顺序向action_tests添加新函数,理解仍然有效!当您想要在未来添加对某些新操作的支持时,只需要添加一行,而不是可能需要重新编写您的if分支。


0
投票

如果你真的想做一个列表理解

>>> ["Buy"*(i<=5) + "hold"*(i == 7) + "short-sell"*(i == 6) + "sell"*(i > 7) for i in range(10)]
['Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'short-sell', 'hold', 'sell', 'sell']
© www.soinside.com 2019 - 2024. All rights reserved.