7
votes

Trier une liste de tuples sans sensibilité de cas

Comment puis-je régler efficacement et facilement une liste de tuples sans em> étant sensible au boîtier?

Par exemple, ceci: p> xxx pré>

devrait ressemblent à ceci une fois trié: p> xxx pré>

Le tri lexicographique régulier mettra "A" avant 'a' et donner cela: P>

[('A', 'b'), ('a', 5), ('a', 'a'), ('a', 'c')]


0 commentaires

5 Réponses :


12
votes

Vous pouvez utiliser Trier code> 'S code> argument code> Pour définir la manière dont vous souhaitez considérer chaque élément par rapport au tri:

def lower_if_possible(x):
    try:
        return x.lower()
    except AttributeError:
        return x

L=[('a', 'c'), ('A', 'b'), ('a', 'a'), ('a', 5)]

L.sort(key=lambda x: map(lower_if_possible,x))
print(L)


1 commentaires

Cool, j'essayais de comprendre comment utiliser la clé dans cette situation et à l'aide de la carte () ne m'a pas eue. Merci!



0
votes

Quelque chose comme ça devrait fonctionner: xxx

En d'autres termes, créez une nouvelle liste, où chaque élément est un tuple composé de l'ancien tuple, préfixé avec le même tuple avec chaque élément de minuscule. Ensuite, triez cela.

Ceci est un peu plus rapide que l'utilisation de la fonction de comparaison de la fonction de comparaison en mode Si votre liste est longue.


0 commentaires

2
votes
list_of_tuples.sort(key=lambda t : tuple(s.lower() if isinstance(s,basestring) else s for s in t))

2 commentaires

Belle solution compacte. Merci!


Si vos tuples peuvent contenir d'autres tuples ou des structures de séquence, vous voudrez probablement que la solution inférieure_if_possible, enveloppée dans un appeleur récursif appelé quelque chose comme Bal inférieure, qui s'appelle elle-même s'il trouve un membre qui est en soi une séquence.



0
votes

Voici une solution qui utilise l'idée de décorateur illustrée dans la section "Triée par clés" d'un article de Wiki Python ( http://wiki.python.org/moin/howto/sorting/ ).

# Create a list of new tuples whose first element is lowercase
# version of the original tuple.  I use an extra function to
# handle tuples which contain non-strings.
f = lambda x : x.lower() if type(x)==str else x
deco = [(tuple(f(e) for e in t), t) for t in ex]

# now we can directly sort deco and get the result we want
deco.sort()

# extract the original tuples in the case-insensitive sorted order
out = [t for _,t in deco]


0 commentaires

0
votes

Une version simplifiée de Paul McGuires fonctionne: xxx

(où t [0] références que vous souhaitez utiliser dans ce cas le premier)


0 commentaires