2017-11-16 1 views
0

Ich möchte eine einfache Bedingung machen, um zu überprüfen, ob das Element 'a' in A und das Element 'b' in B eine bestimmte Eigenschaft hat.Wie macht man Element-Check-Code einfacher oder einzeiliger in Python?

der untenstehende Code funktioniert gut, es sieht schmutzig aus, also, ich will es einfacher machen, oder Ein-Liner. Gibt es irgendeinen Weg das zu tun?

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

Sie können die 'any' oder 'all' Funktionen zusammen mit Generatorausdrücken ausprobieren. Etwas wie 'all (c_matrix.loc() [a] [b] == '->' für ein in A für b in B) könnte funktionieren. – mkrieger1

+0

Da 'c_matrix.loc()' nur ein Label-basierter Indexer ist, haben Sie versucht * einfach zu testen, ob '->' in Ihrem Frame * vorhanden ist? –

+1

Versuchen Sie etwas wie 'all (c_matrix.loc() [a] [b] ==" -> "für a in A für b in B)' –

Antwort

2

die möglichen Pandas oder numpy Winkel Ignoriert die c_matrix.loc() verfügbar sein könnte vermuten lässt, können Sie all() verwenden, um die exakt gleiche Funktionalität zu erhalten:

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

all() Kurzschluss; sobald ein c_matrix.loc()[a][b] == "->" ausfällt, wird False zurückgegeben. True wird nur erzeugt, wenn alle Tests bestanden werden.

0

Hier habe ich einen anderen Ansatz von Martijn ist einer folgen, postuliert er, dass Numpy/Pandas für die Antwort nicht relevant sind, wie ich mit dem Verständnis ausgehen, dass alles ein Numpy Array ...

Zuerst für Vorführzwecken schaffen wir eine Matrix von Zeichenketten, darunter diejenige, die wir nicht wollen, in Ihrer Probe

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') 

nächsten zwei Vektor der Indizes

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

und die richtige Sende Regel sie Indizierung matrix

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

und schließlich, ähnlich wie das anzuwenden, was in anderen Antworten vorgeschlagen wurde in den Kommentaren und vorgeschlagen

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

Ich möchte die matrix[A[:,None],B] Linie betonen, das könnte so kommentiert werden "Schau ma ', keine loops" ;-)


In Bezug auf eine Funktion de finition (allgemeiner als Ihre)

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

zu beachten, dass die Funktion w/r Empfangen in ab und Sequenzen, die nicht elastisch ist Numpy Arrays sind.

+0

Er hat nicht gesagt, dass sie nicht relevant waren. Er sagte, die "möglichen Winkel" zu ignorieren. Das bedeutet, dass er anerkennt, dass es andere relevante Antworten gibt, obwohl er nicht auf sie eingehen wird. – Rookie