簡體   English   中英

Pythonic方式在列表推導中使用第二個條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM