2011-10-18 7 views
6

Mam zakres wartości (L,R,U,D) i dwie zmienne, d i newd, zawierające jedną z nich. Muszę sprawdzić, czy d i newd są w tym samym podzbiorze (L,R lub U,D), czy też nie.
wiem, że mogę to zrobić:Sprawdź, czy dwie zmienne mają wartości z dwóch różnych zestawów, a zakres DRY

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

to rzeczywiście zwraca False jeśli oboje mają wartości w L,R lub U,D i True inaczej. Mimo to uważam, że jest to bardzo wyczerpujące. Jakieś sugestie dotyczące podejścia bardziej DRY?

Odpowiedz

4

Jeśli wiesz, że istnieją tylko dwa zestawy i że twoje wartości musi się w jednej lub drugiej strony, to można uprościć do tego:

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

Objaśnienie:

  • Jeśli d jest w zestawie 1, a nowy jest w zestawie 2, obie strony ==True, więc wyrażenie zwraca True.
  • Jeśli d jest w zestawie 2, a nowy jest w zestawie 1, obie strony == to False, więc wyrażenie zwraca True.
  • Jeśli są w tym samym zestawie, jedna strona == zwróci False i drugą True, więc wynikiem wyrażenia będzie False.
+0

Nie jest źle ... Zastanawiam się, czy istnieje sposób, aby to zrobić wymieniając tylko jeden zestaw, ale może to nie jest możliwe. – etuardu

+0

@etuardu: '(d w zestaw1)! = (Nowość w zestaw1)' działa również. –

+0

Mam na myśli jeden zestaw tylko raz – etuardu

0

Jak o:

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

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