Bonjour, j'aimerais ranger mon dictionnaire players dans l'ordre décroissant salon la valeur z de la liste en python :


players = {"name": [x, y, z]}


Merci beaucoup de votre aide
Modérateur
Bonjour,

Je vais supposer que players est en fait entouré de crochets, et qu'il contient une liste d'éléments entre accolades (parce que sinon, je ne vois pas bien ce qu'on pourrait trier). Je suppose aussi que x, y et z sont des chaines de caractères.

Il faut employer la méthode .sort() avec 2 paramètres :
- le paramètre key qui vaudra une fonction qui retourne la valeur de ton "z" (c'est sur cette valeur que se fera le tri du coup)
- le paramètre reverse avec la valeur True pour trier par ordre décroissant

Un code possible :
def get_z(e):
	n=e.get('name')
	return n[2]
	
players = [
{"name": ["a", "h", "c"]},
{"name": ["g", "b", "i"]},
{"name": ["d", "e", "f"]}
]

players.sort(key=get_z,reverse=True)
print(players)


Amicalement,
Modifié par parsimonhi (01 Feb 2021 - 00:57)
Merci beaucoup de ta réponse, j'ai du effectuée une petite modifications pour que ça marche mais sinon c'est parfait. "name" était qu'une expression pour expliquer, en réalité "name" est différents pour chaque élément de players. Bref je sais pas si ce que j'ai fait est la meilleure façon mais voilà comment j'ai changé ce que tu m'as proposé. Merci beaucoup à toi!

def get_z(e):
    for j in e:
        n = e.get(j)
        return n[2]

Bonne nuit (:
Modérateur
Et l'eau,

je comprends pas bien la question initiale. Parce que il y a pas plus simple à faire :


players = {"name": ['x', 'y', 'z']} # x/y/z ==> string ou autre type d'objet ?
players['name'].reverse()
print(players)


@parsimonhi:
pour une écriture plus pythonique :

players = [
    {"name": ["a", "h", "c"]},
    {"name": ["g", "b", "i"]},
    {"name": ["d", "e", "f"]},
]

players.sort(key=lambda e: e['name'][2], reverse=True)
print(players)

# une variante
out = list(sorted(players, key=lambda e: e.get('name')[2], reverse=True))
print(out)


@vzitoi
sauf erreur de ma part, je ne vois pas l'intérêt de faire une boucle.
Modifié par niuxe (01 Feb 2021 - 03:28)
Modérateur
Bonjour

niuxe a écrit :
@parsimonhi:
pour une écriture plus pythonique...

Oui, c'est mieux (mais plus difficile à expliquer). Smiley cligne

vzytoi a écrit :
... "name" était qu'une expression pour expliquer, en réalité "name" est différents pour chaque élément de players. Bref je sais pas si ce que j'ai fait est la meilleure façon mais voilà comment j'ai changé ce que tu m'as proposé...

Si on ne connait pas le nom de la propriété a priori et qu'on sait juste que c'est la 1re, faire une boucle me parait peu propre.

Voici une version qui reprend la proposition de niuxe, mais en tenant compte du fait que le nom de la propriété est inconnue :
players = [
	{"name1": ["a", "h", "c"]},
	{"name2": ["g", "b", "i"]},
	{"name3": ["d", "e", "f"]}
]

players.sort(key=lambda e: list(e.values())[0][2], reverse=True)
print(players)

Amicalement,
Modérateur
parsimonhi a écrit :

Oui, c'est mieux (mais plus difficile à expliquer). Smiley cligne


Pas tant que ça. En JS, il y a map, each, filter etc. Même php (qui est à la traine) adopte cette manière de coder.

+1 pour ta dernière proposition Smiley smile