web-dev-qa-db-fra.com

Méthode efficace pour créer un ensemble de tuple dans lequel l'ordre des tuples n'a pas d'importance

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?

17
shivank01

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. Tuples (1, 1, 2) et (1, 2) deviendraient égaux après la conversion en set.
  2. Même dans le cas où nous considérons des n-uplets de longueur 2, nous ajouterions une hypothèse selon laquelle 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))
11
jpp

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)}
2
Netwave

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)}
0
kantal