Comment puis-je régler efficacement et facilement une liste de tuples sans em> étant sensible au boîtier? Par exemple, ceci: p> devrait ressemblent à ceci une fois trié: p> Le tri lexicographique régulier mettra "A" avant 'a' et donner cela: P> [('A', 'b'), ('a', 5), ('a', 'a'), ('a', 'c')]
5 Réponses :
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)
Cool, j'essayais de comprendre comment utiliser la clé dans cette situation et à l'aide de la carte () ne m'a pas eue. Merci!
Quelque chose comme ça devrait fonctionner: 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. P> Ceci est un peu plus rapide que l'utilisation de la fonction de comparaison code> de la fonction de comparaison en mode code> Si votre liste est longue. P> P>
list_of_tuples.sort(key=lambda t : tuple(s.lower() if isinstance(s,basestring) else s for s in t))
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.
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]
Une version simplifiée de Paul McGuires fonctionne: (où t [0] références que vous souhaitez utiliser dans ce cas le premier) P> P >