[英]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數組的a
和b
序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.