2014-09-18 5 views
-1

Ce qui est une façon élégante de faire ce qui suit en python:Soustraction tuples

modes = (1,2,4,5,7,8,9) 

start_modes = (1,2,5) 
stop_modes = tuple(set(modes) - set(start_modes)) 

fast_modes = (2,7) 
slow_modes = tuple(set(modes) - set(fast_modes)) 

Je suis définir le comportement d'un système que je teste. Dans mes tests, je vais parfois être intéressé par itératif sur tous les modes et parfois je serai intéressé par itératif sur slow_mode s par exemple.

Je veux que toutes les variables définies ci-dessus soient immuables puisqu'elles ne devraient jamais changer. Je préférerais aussi que leur commande soit toujours la même puisque je voudrais que mes tests se comportent de manière cohérente.

+1

Veuillez nous dire le résultat que vous voulez obtenir – Jesuisme

+0

@Jesuisme Question mise à jour – Baz

+0

Un exemple de la sortie désirée s'il vous plaît; like (1,2,4) - (1,2) = (4,) – Jesuisme

Répondre

2

Vous utilisez sets à la place:

modes = frozenset([1,2,4,5,7,8,9]) 

start_modes = {1,2,5} 
stop_modes = modes - start_modes 

fast_modes = {2,7} 
slow_modes = modes - fast_modes 

Ici frozenset() est l'équivalent de set()tuple(); un type immuable. Les ensembles start_modes et fast_modes utilisent la notation littérale {...}, produisant un objet mutable set() à la place. Vous pouvez toujours utiliser frozenset() pour ceux aussi.

Les ensembles ne peuvent contenir que des éléments uniques et ne gèrent pas les éléments. Vous pouvez toujours convertir un ensemble en un tuple, mais un tuple semble être le mauvais type de données pour votre problème.

Les jeux sont itérables; vous pouvez faire une boucle sur ceux-ci, mais l'ordre dépend de l'historique d'insertion et de suppression de l'ensemble et des valeurs contenues.

Si l'ordre est importante, utilisez une expression de générateur dans un appel tuple() pour produire vos valeurs:

modes = (1, 2, 4, 5, 7, 8, 9) 

start_modes = (1, 2, 5) 
stop_modes = tuple(m for m in modes if m not in start_modes) 

fast_modes = (2, 7) 
slow_modes = tuple(m for m in modes if m not in fast_modes) 

Bien qu'il ne fait pas beaucoup de différence ici, si vous pouvez faire start_modes et fast_modesset ou frozenset objets les tests d'adhésion négatifs not in sera plus rapide.

+0

Je veux que les modes soient immuables – Baz

+1

'frozenset', plutôt? – chepner

+0

@chepner: J'ai besoin de plus de thé, évidemment. Corrigée. –

1

Utilisez un ensemble:

modes = {1,2,4,5,7,8,9} 
stop_modes = modes - {1,2,5} 
+0

Je veux que les modes soient immuables – Baz

+1

@Baz: alors vous pouvez utiliser 'frozenset' à la place. – geoffspear