Disons que j'ai deux 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')}
Maintenant, ce que je veux faire est de trouver la différence définie b \ a
mais en ignorant le dernier élément de chaque tuple. C'est comme faire quelque chose comme ça:
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')}
Production attendue:
b \ a = {('1', '2', '6', 'b')}
Existe-t-il un moyen évident / pythonique d'y parvenir sans avoir à parcourir manuellement chaque ensemble et à les comparer tuple[:3]
?
python
python-2.7
set
Grajdeanu Alex.
la source
la source
set
- classe et écraser l'opération de différence. Il n'y a pas de solution prête à l'emploi que je sache et je doute qu'une existe.aa = { t[:3] for t in a }
tuple
- classe et remplacement de l'opérateur de différenceRéponses:
Voici comment vous pouvez écrire votre propre classe pour remplacer le comportement de hachage normal d'un tuple:
avec sortie
Pour modifier le comportement des ensembles de tuples, nous devons modifier la façon dont les tuples sont hachés.
De là ,
Donc, pour que le hachage ignore le dernier élément, nous devons surcharger les méthodes de dunder
__eq__
et de__hash__
manière appropriée. Cela ne finit pas par être si difficile car tout ce que nous avons à faire est de couper le dernier élément et de déléguer ensuite les méthodes appropriées d'une normaletuple
.Lectures complémentaires:
la source
:)
. En réalité, il s'agit simplement de combiner des morceaux de surcharge d'opérateur et le fonctionnement du hachage en Python.Voici une approche définissant
a
etb
avec des listes plutôt que des ensembles, car il me semble que la solution la plus simple implique l'indexationb
:la source
Les décors fonctionnent bien. Ce sont vos données qui ne fonctionnent pas correctement. S'ils sont différents mais qu'ils sont en fait les mêmes, définissez un type de données qui se comporte comme vous le souhaitez. Ensuite, le jeu fonctionne bien seul.
la source
__repr__
et__hash__
en termes de tuples, mais pas__eq__
. Ne serait-il pas plus court d'utiliser des tuples ici aussi? En fait, vous pouvez utiliser le découpage ici et__hash__
dedans pour raccourcir davantage le code.