2011-10-18 12 views
6

I hanno un intervallo di valori (L,R,U,D) e due variabili, d e newd, contenente uno di essi. Devo controllare se d e newd sono nello stesso sottoinsieme (L,R o U,D) oppure no.
So che posso fare questo:Verificare se due variabili hanno valori di due set diversi, il modo DRY

d in {'L','R'} and newd in {'U','D'} or d in {'U','D'} and newd in {'L','R'} 

questo infatti restituisce False se entrambi hanno valori in L,R o U,D e True altrimenti. Tuttavia, lo trovo molto ridondante. Alcuni suggerimenti su un approccio più DRY?

risposta

4

Se si sa che ci sono solo due set e che i valori devono essere in uno o l'altro, quindi è possibile semplificare in questo modo:

(d in set1) == (newd in set2) 

Spiegazione:

  • Se d è nell'insieme 1 e newd è nell'insieme 2, entrambi i lati di == sono True, quindi l'espressione restituisce True.
  • Se d è nell'insieme 2 e newd è nell'insieme 1, entrambi i lati di == sono False, quindi l'espressione restituisce True.
  • Se sono nello stesso set, un lato di == restituirà False e l'altro True in modo che il risultato dell'espressione sarà False.
+0

Non è affatto male ... Mi chiedo se c'è un modo per fare questo menzionare un solo set, ma forse questo non è possibile. – etuardu

+0

@etuardu: '(d in set1)! = (Newd in set1)' funziona anche. –

+0

Intendevo un set una sola volta – etuardu

0

ne dite:

In [8]: dmap = {'L':0, 'R':0, 'U':1, 'D':1} 

In [9]: dmap[d] != dmap[newd] 
Out[9]: False 
Problemi correlati