簡體   English   中英

如何在python中使元素檢查代碼更簡單或更簡單?

[英]how to make element check code simpler or one-liner in python?

我想做一個簡單的條件來檢查A中的元素“ a”和B中的元素“ b”是否具有某些特征。

下面的代碼運行良好,看起來很臟,所以,我想使其更簡單,或者說是單一的。 有什么辦法嗎?

    def check_direction(A, B):
        for a in A:
            for b in B:
                if c_matrix.loc()[a][b]!="->":
                    return False
        return True

忽略c_matrix.loc()建議的可能的大熊貓或小角度,可以使用all()獲得完全相同的功能:

return all(c_matrix.loc()[a][b] == "->" for a in A for b in B)

all()短路; 一旦c_matrix.loc()[a][b] == "->"失敗,將返回False 僅在所有測試通過的情況下才會產生True

在這里,我采用與Martijn的方法不同的方法,他假定Numpy / Pandas與答案無關,我繼續理解一切都是Numpy數組...

首先,出於演示目的,我們創建了一個字符串矩陣,其中包括我們在樣本中不需要的字符串

In [37]: toks = ['--', '-+', '+-', '-|', '|-', '->', '<-']
In [38]: matrix = np.array([[toks[np.random.randint(7)] for j in range(5)] for i in range(4)])
In [39]: matrix
Out[39]: 
array([['|-', '--', '<-', '-|', '-|'],
       ['|-', '<-', '--', '+-', '--'],
       ['|-', '-+', '-+', '<-', '-+'],
       ['<-', '->', '->', '-|', '--']],
      dtype='<U2')

接下來,兩個索引向量

In [40]: A, B = np.array([2,3]), np.array([0,1,4])

以及將其應用於索引matrix的正確廣播規則

In [41]: matrix[A[:,None],B]
Out[41]: 
array([['|-', '-+', '-+'],
       ['<-', '->', '--']],
      dtype='<U2')

最終,類似於評論中提出的建議和其他答案中提出的建議

In [42]: np.all(matrix[A[:,None],B] == '->')
Out[42]: False

我想強調一下matrix[A[:,None],B]行,可以這樣注釋:“看,沒有循環” ;-)


就功能定義而言(比您的定義更籠統)

def(m, a, b, tok):
    return np.all(m[np.array(a)[:,None], np.array(b)] == tok)

請注意,該函數具有彈性,可接收不是Numpy數組的ab序列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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