[英]Pythonic way to use the second condition in list comprehensions
我們假設以下函數:
def myfun(my_list, n, par1=''):
if par1 == '':
new_list = [[my_fun2(i,j) for j in range(n)] for i in range(n)]
else:
new_list = [[my_fun2(i,j) for j in range(n)] for i in range(n) if my_fun2(i,n) == par1]
return new_list
如您所見,根據par1
,有兩種不同的場景。 我不喜歡第3行和第5行幾乎相同,並且不遵循DRY(不要重復自己)原則。 如何改進此代碼?
這可能有效:
new_list = [[my_fun2(i,j) for j in range(n)] for i in range(n) if par1 == '' or my_fun2(i,n) == par1]
所以像這樣使用:
def myfun(my_list, n, par1=''):
return [
[my_fun2(i,j) for j in range(n)]
for i in range(n) if par1 == '' or my_fun2(i,n) == par1
]
您可以通過使用在第一種情況下僅返回True
的函數和在第二種情況下實際將my_fun2
結果與par1
進行比較的函數來動態選擇條件函數:
def myfun(my_list, n, par1=''):
if par1 == '':
cond = lambda x, y: True
else:
cond = lambda i, n: my_fun2(i, n) == par1
return [[my_fun2(i,j) for j in range(n)] for i in range(n) if cond(i,n)]
或者,如果par1
不是空字符串,則用生成器表達式替換外部循環:
def myfun(my_list, n, par1=''):
if par1 == '':
outer = range(n)
else:
# a conditional generator expression
outer = (i for i in range(n) if my_fun2(i,n) == par1)
return [[my_fun2(i,j) for j in range(n)] for i in outer]
但是,不要讓DRY使函數更難以讀取,維護或調試。 我個人認為你的方法很好(可能更快),你可能不應該改變任何東西。
為什么不使用過濾器?
from operator import eq
def myfun(my_list, n, par1=''):
new_list = ([my_fun2(i,j) for j in range(n)] for i in range(n))
if par1 != '':
new_list = filter(eq(par1),new_list)
return list(new_list)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.