我正在尝试将“常规的”嵌套if-else转换为python中的列表理解,但我无法完成。
def functst(a, list_a, b, list_b):
list_result = []
for i in range(len(list_a)):
if a != 0:
if list_a[i] <= a:
list_result.insert(i, 1)
else:
list_result.insert(i, a/list_a[i] * (1 - list_b[i]))
elif list_a[i] <= b:
list_result.insert(i,1)
else:
list_result.insert(i, b/list_a[i] * (1-list_b[i]))
return list_result
我想使用嵌套的if-else将其转换为列表理解。有输入吗?
答案 0 :(得分:1)
丑陋,但确实可以做到:
list_result = [
(
1
if list_a[i] <= a else
a/list_a[i] * (1 - list_b[i])
)
if a != 0 else
(
1
if list_a[i] <= b else
b/list_a[i] * (1-list_b[i])
)
for i in xrange(len(list_a))
]
我个人反对如此复杂的逻辑;尽管您的解决方案可能不是Python风格的,但更容易理解。
如果您对细节感兴趣,请按照以下步骤操作:
if
进行交易:list_result = [
(first condition)
if a != 0 else
(second condition)
(for i in something, or for element in set, or... don't care yet)
]
if
:list_result = [
(
1
if list_a[i] <= a else
a/list_a[i] * (1 - list_b[i])
)
if a != 0 else
(second condition)
(still skipping the iteration part, will return later to it)
]
if
。答案 1 :(得分:1)
不确定为什么要这样做,但是也许
if a:
return [1 if list_a[i] <= a else (a / list_a[i] * (1 - list_b[i]))
for i in range(len(list_a))]
else:
return [1 if list_a[i] <= b else (b / list_a[i] * (1 - list_b[i]))
for i in range(len(list_a))]
您可以使用return [<first list>] if a else [<second list>]
将其变成单线
或可能是带有嵌套的单个理解:
[(... if ... <= a else ...) if a
else (... if ... <= b else ...)
for i in range(...)]
但是,为什么呢?
答案 2 :(得分:0)
在每次迭代中,您要评估一个包含2个常量(a
,b
)和两个变量(list_a
和list_b
的内容)的函数。我的建议是将逻辑移到使用这四个参数的辅助函数中。
def helper(a, A, b, B):
if a != 0:
if A <= a:
return 1
else:
return a/A*(1-B)
elif A <=b:
return 1
else:
return b/A*(1-B)
现在,您可以使用helper
在列表理解内调用zip
:
list_result = [helper(a,A_val,b,B_val) for A_val, B_val in zip(list_a, list_b)]
此外,如果要使用原始功能,则应使用append
而不是insert
。更改之后,您的原始方法就像列表理解一样具有Python风格。