Powiedzmy, że mam dwa set()
s:
a = {('1', '2', '3', 'a'), ('1', '2', '4', 'a'), ('1', '2', '5', 'b')}
b = {('1', '2', '3', 'b'), ('1', '2', '4', 'b'), ('1', '2', '6', 'b')}
Teraz chcę znaleźć ustaloną różnicę, b \ a
ale ignorując ostatni element z każdej krotki. To tak, jakby zrobić coś takiego:
a = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '5')}
b = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '6')}
In[1]: b - a
Out[1]: {('1', '2', '6')}
Oczekiwany wynik:
b \ a = {('1', '2', '6', 'b')}
Czy istnieje jakiś oczywisty / pytonowy sposób na osiągnięcie tego bez konieczności ręcznego iterowania każdego zestawu i sprawdzania każdego z nich tuple[:3]
?
python
python-2.7
set
Grajdeanu Alex.
źródło
źródło
set
i zastąpić operację różnicową. Nie ma gotowego rozwiązania, o którym wiem i wątpię, by istniało.aa = { t[:3] for t in a }
tuple
i zastępuj operator różnicyOdpowiedzi:
Oto, w jaki sposób możesz napisać własną klasę, aby zastąpić normalne zachowanie mieszania krotki:
z wyjściem
Aby zmodyfikować sposób działania zestawów krotek, musimy zmodyfikować sposób mieszania krotek.
Od tutaj ,
Tak więc w celu uczynienia mieszania zignorować ostatni element, musimy przeciążać metody Dunder
__eq__
i__hash__
odpowiednio. Nie jest to wcale takie trudne, ponieważ wszystko, co musimy zrobić, to odciąć ostatni element, a następnie przekazać odpowiednie metody normalnetuple
.Dalsza lektura:
źródło
:)
. Naprawdę polega to na połączeniu przeciążeń operatora i działania funkcji mieszania w Pythonie.Oto jeden sposób definiowania
a
ib
wykazy zamiast zestawów, ponieważ wydaje mi się, że najbardziej proste rozwiązanie do przodu zakłada indeksowanieb
:źródło
Zestawy działają dobrze. Twoje dane nie działają poprawnie. Jeśli wyglądają inaczej, ale w rzeczywistości są takie same, zdefiniuj typ danych, który zachowuje się tak, jak chcesz. Następnie zestaw działa sam świetnie.
źródło
__repr__
i__hash__
pod względem krotek, ale nie__eq__
. Czy nie byłoby też krótsze użycie krotek tutaj? W rzeczywistości możesz użyć krojenia tutaj i w__hash__
celu dalszego skrócenia kodu.