列表理解中的嵌套控制流 Python
Nested Control Flow in list comprehension Python
如何将这个 for 循环转换为带有嵌套 if 语句的列表理解?
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',
'Buy',
'Buy',
'Buy',
'Buy',
'Buy',
'Short-sell',
'Hold',
'Sell',
'Sell']
到目前为止我得到的最好的是:
["Buy" if i <= 5 else "Hold" if i > 5 and i <= 7 else "Sell"
for i in range(10)]
['Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'hold', 'hold', 'Sell', 'Sell']
如有任何帮助,我们将不胜感激! :)
您错过了 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']
但是,确实没有充分的理由这样做。它不容易阅读,而且(如您所见)很容易忽略错误。如果我是你,我会坚持你原来的模式(虽然你在这里发布的代码不太有效)
这是您的各种条件语句的等效表达式:
['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']
如果你真的想做一个列表理解
>>> ["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']
这是一个非常不同的方法:
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)]
如果 none 的测试 return 对您的 action_tests
为真,则 "else" 条件由默认值 next
处理。
您真的不想将所有复杂的逻辑压缩到一行中,因为这会使可维护性成为一场噩梦——很难检测到错误,甚至更难在代码中添加更多逻辑规范更改。
这种方法是对原始集 if if
语句的改进,因为它很容易扩展...只需按适当的优先顺序向 action_tests
添加新函数,理解仍然作品!当您想要添加对一些新操作的支持时,只需添加一行,而不是可能不得不重新处理您的 if
分支。
如何将这个 for 循环转换为带有嵌套 if 语句的列表理解?
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', 'Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'Short-sell', 'Hold', 'Sell', 'Sell']
到目前为止我得到的最好的是:
["Buy" if i <= 5 else "Hold" if i > 5 and i <= 7 else "Sell"
for i in range(10)]
['Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'Buy', 'hold', 'hold', 'Sell', 'Sell']
如有任何帮助,我们将不胜感激! :)
您错过了 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']
但是,确实没有充分的理由这样做。它不容易阅读,而且(如您所见)很容易忽略错误。如果我是你,我会坚持你原来的模式(虽然你在这里发布的代码不太有效)
这是您的各种条件语句的等效表达式:
['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']
如果你真的想做一个列表理解
>>> ["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']
这是一个非常不同的方法:
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)]
如果 none 的测试 return 对您的 action_tests
为真,则 "else" 条件由默认值 next
处理。
您真的不想将所有复杂的逻辑压缩到一行中,因为这会使可维护性成为一场噩梦——很难检测到错误,甚至更难在代码中添加更多逻辑规范更改。
这种方法是对原始集 if if
语句的改进,因为它很容易扩展...只需按适当的优先顺序向 action_tests
添加新函数,理解仍然作品!当您想要添加对一些新操作的支持时,只需添加一行,而不是可能不得不重新处理您的 if
分支。