如何使用嵌套的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
[&#39;购买&#39 ;, &#39;购买&#39 ;, &#39;购买&#39 ;, &#39;购买&#39 ;, &#39;购买&#39 ;, &#39;购买&#39 ;, &#39;卖空&#39 ;, &#39;保持&#39 ;, &#39;卖&#39 ;, &#39;卖&#39;]
到目前为止,我所做的最好的是:
["Buy" if i <= 5 else "Hold" if i > 5 and i <= 7 else "Sell"
for i in range(10)]
[&#39;购买&#39;,&#39;购买&#39;&#39;购买&#39;,&#39;购买&#39;购买&#39;,& #39;购买&#39;持有&#39;,&#39;持有&#39;,&#39;销售&#39;,&#39;销售&#39;]
任何帮助都将非常感谢! :)
答案 0 :(得分: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']
然而,这样做是没有充分理由的。它并不容易阅读(如你所见)很容易忽视错误。如果我是你,我会坚持你的原始模式(你在这里发布的代码虽然不太合适)
答案 1 :(得分: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']
答案 2 :(得分: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
分支。
答案 3 :(得分: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']