Je veux faire un ensemble de n-uplets dans lequel l'ordre des n-uplets ne devrait pas avoir d'importance.
[(1,2),(1,3),(2,1)]
Il devrait sortir comme ceci:
{(1,2),(1,3)}
Y at-il un moyen efficace de faire cela en python?
Vous pouvez appliquer sorted
, puis Tuple
, puis la conversion en set
:
res = set(map(Tuple, map(sorted, L)))
print(res)
{(1, 2), (1, 3)}
Explication
Il y a deux bonnes raisons pour lesquelles vous ne devriez pas convertir chaque tuple en set
comme étape initiale:
(1, 1, 2)
et (1, 2)
deviendraient égaux après la conversion en set
.Tuple({(1, 2)})
et Tuple({(2, 1)})
sont égaux. Bien que cela puisse être vrai, cela serait considéré comme un détail d'implémentation, puisque set
est considéré comme non ordonné.Composition de la fonction
La composition des fonctions n’est pas native de Python, mais si vous avez accès à la bibliothèque tierce partie toolz
, vous pouvez éviter les imbriquées map
:
from toolz import compose
tup_sort = compose(Tuple, sorted)
res = set(map(tup_sort, L))
Vous pouvez trier les tuples:
l = [(1,2),(1,3),(2,1)]
res = set(map(lambda x: Tuple(sorted(x)), l))
print(res)
{(1, 2), (1, 3)}
Vous pouvez aussi utiliser la compréhension:
l=[(1, 2), (1, 3), (2, 1)]
res={ Tuple(sorted(t)) for t in l }
print(res)
{(1, 2), (1, 3)}