Est-il possible de trier les deux listes(qui font référence les uns aux autres) exactement de la même façon?
D'accord, c'est peut-être pas la meilleure idée, mais j'étais un peu curieux de savoir si c'est possible. Dire que j'ai deux listes:
list1 = [3,2,4,1, 1]
list2 = [three, two, four, one, one2]
Si je lance list1.sort()
, il va de sorte qu'il [1,1,2,3,4]
mais est-il un moyen de conserver la synchronisation de la liste 2(ainsi que je peux dire, le point 4 appartient à "trois")? Mon problème est que j'ai un joli programme complexe qui fonctionne bien avec des listes, mais je sorte de besoin pour commencer le référencement des données. Je sais que c'est une situation parfaite pour les dictionnaires, mais j'essaie d'éviter les dictionnaires dans mon traitement parce que je n'ai besoin de trier les valeurs de clé(si je dois utiliser des dictionnaires, je sais comment les utiliser).
Fondamentalement la nature de ce programme, les données arrivent dans un ordre aléatoire(comme ci-dessus), j'ai besoin de les trier, les traiter et envoyer les résultats(de l'ordre n'a pas d'importance, mais les utilisateurs doivent connaître le résultat de qui appartient à la clé). J'ai pensé à le mettre dans un dictionnaire en premier, puis le tri de la liste, mais je ne dispose d'aucun moyen de différencier les éléments dans l', avec la même valeur si l'ordre n'est pas maintenu(il peut avoir un impact lors de la communication des résultats auprès des utilisateurs). Donc, idéalement, une fois que je reçois les listes je préfère trouver un moyen de trier les deux listes ensemble. Est-ce possible?
- Je tiens à souligner que vos variables dans la liste 2 ne pointent pas vers les services de renseignements dans la liste 1. E. g. si le changement d'une valeur, tels que des list1[0]=9 et regardez la liste 2, liste 2[0] sera toujours 3. Avec des entiers en python, il n'utilise pas la référence/pointeur, il copie la valeur. Vous auriez été mieux de passer par la liste 2 = list1[:]
Vous devez vous connecter pour publier un commentaire.
Une approche classique de ce problème est d'utiliser le "décorer, de tri, undecorate" l'idiome, ce qui est particulièrement simple à l'aide de python intégré dans
zip
fonction:De ces cours ne sont plus des listes, mais c'est facile de remédier, si c'est important:
Il est intéressant de noter que le ci-dessus peut sacrifier la vitesse pour la concision; la version, ce qui prend 3 lignes, est un peu plus vite sur ma machine pour les petites listes:
D'autre part, pour les grandes listes, la version d'une ligne pourrait être plus rapide:
Comme Quantum7 souligne, JSF suggestion de l' est un peu plus rapide, mais il sera probablement jamais être un peu plus rapide, parce que Python utilise le même UAD idiome en interne pour tous basés sur une clé sortes. C'est juste arrivé un peu plus proche du métal nu. (Cela montre juste comment bien optimisé la
zip
routines sont!)Je pense que le
zip
est une approche plus souple et est un peu plus lisible, de sorte que je le préfère.*
opérateur ne argument déballage,zip(*x)
a la propriété intéressante qu'elle est son propre inverse:l = [(1, 2), (3, 4)]; list(zip(*zip(*l))) == l
retourneTrue
. C'est en effet une transposition de l'opérateur.zip()
sur son propre est un peu le même opérateur, mais suppose que vous avez décompressé la séquence d'entrée manuellement.Vous pouvez trier les index à l'aide des valeurs clés:
Obtenir des listes triées donné triés index:
Dans votre cas, vous ne devriez pas avoir
list1
,list2
mais plutôt d'une liste de paires:Il est facile de créer; il est facile de trier en Python:
Trier en fonction de la première valeur seulement:
list()
autour demap()
si vous souhaitez utiliser ce code en Python 3.J'ai utilisé la réponse donnée par senderle pendant un long moment jusqu'à ce que j'ai découvert
np.argsort
.Voici comment cela fonctionne.
Je trouve cette solution plus intuitive, et il fonctionne vraiment bien. La perfomance:
Même si
np.argsort
n'est pas le plus rapide, je le trouve plus facile à utiliser.TypeError: only integer arrays with one element can be converted to an index
(Python 2.7.6, numpy 1.8.2). Pour la fixer, list1 et list2 doivent être déclarés comme des tableaux numpy.np.argsort
n'essayez pas de convertir à unnp.array
en interne.Schwartzian transformer. Le Python intégrée de tri est stable, de sorte que les deux
1
s ne pas causer un problème.Ce sujet:
Vous pouvez utiliser l'argument-clé de tri() méthode, sauf si vous avez deux mêmes valeurs dans la liste 2.
Le code est donné ci-dessous:
Il trie la liste 2 selon les valeurs correspondantes dans la liste 1, mais assurez-vous que lors de l'utilisation de cette, pas de deux valeurs dans la liste 2 évaluer à l'égalité, car la liste.fonction index() donne la première valeur
Une façon consiste à suivre la trace de chaque indice passe par le tri de l'identité [0,1,2,..n]
Cela fonctionne pour n'importe quel nombre de listes.
Déplacer chaque élément à sa position. À l'aide de raccords est le meilleur.
Note que nous pourrions avoir réaffirmé les listes sans même le tri:
Vous pouvez utiliser le
zip()
etsort()
fonctions pour ce faire:Espère que cette aide
une solution algorithmique:
Sorties:
->
vitesse de Sortie:0.2s