Étant donné une liste d'indices et zéro ou plusieurs listes d'entiers, affichez les listes d'entiers, triées par ordre croissant, avec la priorité de clé à partir de la première entrée.
Exemple
Soit l'entrée des clés [1, 0, 2]
et l'entrée des listes [[5, 3, 4], [6, 2, 1], [5, 2, 1]]
. Ces listes doivent être triées par leur deuxième élément, puis le premier élément, puis le troisième élément, dans l'ordre croissant:
- Tout d'abord, nous trions par les valeurs à l'index
1
:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
- Ensuite, nous rompons tous les liens du premier tri en utilisant les valeurs à index
0
:[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
- Enfin, nous rompons tous les liens restants avec les valeurs à l'index
2
(cela ne change en fait rien, car il n'y a plus de liens).
Détails
- Le tri est stable: si deux éléments se comparent égaux par rapport aux clés de tri données, ils doivent rester dans le même ordre relatif dans la sortie. Par exemple, si
A
etB
sont égaux sous les clés de tri données, et que l'entrée était[..., A, ..., B, ...]
,A
doit être placée avantB
dans la sortie. - Une clé de tri ne fera jamais référence à un élément inexistant dans l'une des listes d'entrée.
- Aucune clé de tri ne sera répétée. Ainsi,
[1, 2, 1]
n'est pas une liste valide de clés de tri. - Les éléments non référencés par les clés de tri ne sont pas pris en compte dans l'ordre de tri. Seuls l'ordre relatif initial et les valeurs des éléments référencés par les clés de tri déterminent l'ordre de sortie.
- Vous pouvez choisir si les clés de tri sont indexées zéro ou un indexées.
- Il n'y aura pas de valeurs négatives dans les clés de tri. Si vous choisissez d'utiliser une seule indexation, il n'y aura pas non plus de zéros dans les clés de tri.
- Les valeurs entières ne dépasseront pas la plage représentable nativement de votre langue. Si votre langue choisie est nativement capable d'entiers de précision arbitraire (comme Python), alors n'importe quelle valeur entière peut être présente dans l'entrée, sous réserve des contraintes de mémoire.
Implémentation de référence (Python 2)
#!/usr/bin/env python
keys = input()
lists = input()
print sorted(lists, key=lambda l:[l[x] for x in keys])
Cas de test
Format: keys lists -> output
. Toutes les clés de tri sont indexées zéro.
[1, 0, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[5, 2, 1], [6, 2, 1], [5, 3, 4]]
[1, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[6, 2, 1], [5, 2, 1], [5, 3, 4]]
[0, 1] [[1, 2], [2, 1]] -> [[1, 2], [2, 1]]
[1, 0] [[1, 2], [2, 1]] -> [[2, 1], [1, 2]]
[0] [[4], [10, 11, -88], [-2, 7]] -> [[-2, 7], [4], [10, 11, -88]]
[2] [[-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6]] -> [[-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2]]
[2, 1] [[9, 2, -2, -10, -6], [3, -4, -2]] -> [[3, -4, -2], [9, 2, -2, -10, -6]]
[2, 4, 8] [[5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5], [-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3]] -> [[-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3], [5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5]]
[1, 2, 3, 4, 5] [[-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [5, 3, -6, -5, -4, -4, -8, 2], [9, -4, 1, -1, -3, -2], [-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [1, -5, -3, -10, -7, 9, -8, -5, -1], [-9, 4, -1, -1, 2, 4]] -> [[-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -5, -3, -10, -7, 9, -8, -5, -1], [9, -4, 1, -1, -3, -2], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [5, 3, -6, -5, -4, -4, -8, 2], [-9, 4, -1, -1, 2, 4]]
[8, 7, 3, 2, 4, 9, 1] [[8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9]] -> [[10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5]]