J'ai une liste de tuples: a = [(10, 11), (5, 5), (2, 3), (6, 7), (8, 3), (9, 2)] et une liste simple avec des valeurs b = [10, 9, 10, 2, 8, 3]. Ensuite, j'énumère la deuxième liste et la trie à certaines fins.

b_enumerated = list(enumerate(b))
# [(0, 10), (1, 9), (2, 10), (3, 2), (4, 8), (5, 3)]
b_sorted = sorted(b_enumerated, key=lambda x: x[1], reverse=True)
# [(0, 10), (2, 10), (1, 9), (4, 8), (5, 3), (3, 2)]

Maintenant, je veux réorganiser ma première liste en fonction de la deuxième liste triée, donc je m'attends à obtenir [(10, 11), (2, 3), (5, 5), (8, 3), (9, 2), (6, 7)] (tuples de la liste d'origine dans l'ordre d'index de la liste ordonnée: 0, 2, 1, 4, 5, 3 ), où, par exemple, ma première liste énumérée est [(0, (10, 11)), (1, (5, 5)), (2, (2, 3)), (3, (6, 7)), (4, (8, 3)), (5, (9, 2))].

Comment puis-je obtenir le résultat attendu? Peut-être que j'ai besoin d'utiliser une sorte d'indexation, car le tri des listes compressées n'a pas aidé.

Merci.

1
4dyc0wzn 18 avril 2020 à 01:55

2 réponses

Meilleure réponse

Si le but est de trier a avec l'ordre inversé de b, vous n'avez pas besoin d'énumérer b et de trier la séquence énumérée pour construire une liste intermédiaire de b_sorted en premier lieu.

Au lieu de cela, vous pouvez compresser b avec a pour le tri, puis afficher uniquement le deuxième élément de la séquence résultante de tuples:

[t for _, t in sorted(zip(b, a), reverse=True)]

Cela renvoie:

[(10, 11), (2, 3), (5, 5), (8, 3), (9, 2), (6, 7)]
1
blhsing 17 avril 2020 à 23:32

Réponse rapide

a_sorted =  [a[i[0]] for i in b_sorted]

Brève explication

Vous essayez essentiellement de dire "envoyer a[0] à a_sorted[0], envoyer a[1] à a_sorted[2] ... envoyer a[i] à a_sorted[b_sorted[i][0]]".

Cela peut être fait avec le code

a_sorted =  [a[b_sorted[i][0]] for i in range(len(b_sorted))]

Qui fonctionne bien mais peut être raccourci et sans doute amélioré en itérant plutôt sur b_sorted.

a_sorted =  [a[i[0]] for i in b_sorted]
0
Joz 17 avril 2020 à 23:42