Disons que j'ai deux listes: List1

[26, 45, 15]

List2

[13, 15, 20]

En supposant qu'il y ait toujours exactement un élément qui est le même entre les deux listes, comment réorganiser list2 en:

[20, 13, 15]

Où 15 devient le troisième élément de list2 parce que 15 est le troisième élément de list1 (alors que l'ordre de 13, 15, puis 20 est conservé)? J'ai essayé quelque chose comme ça:

# Reorder list2 to correspond with list1
key = 0
newOrder = []
for i in range(3):
   for j in range(3):
            if list2[i] == list1[j]:  # if elements 
                key = i - j
for k in range(3):
   index = k + key
   if index == 3:
            index = 0
   if index == -1:
            index = 2
   newOrder.append(list2[index])

Mais il n'a pas un taux de réussite de 100%.

0
RudyGoburt 28 août 2020 à 19:37

2 réponses

Meilleure réponse

En supposant que vous vouliez faire pivoter list2 pour que l'élément "partagé" soit dans la même position que dans list1.

Tout d'abord, pour obtenir les indices correspondants, vous n'avez pas à comparer tous les éléments. Au lieu de cela, vous pouvez utiliser un dict pour stocker quel élément se trouve à quelle position, puis obtenir la position correspondante en un seul passage sur list2 (si les listes n'ont toujours que 3 éléments, cela n'a pas d'importance, mais pour les listes plus longues il réduit la complexité de O (n²) à O (n))

list1 = [26, 45, 15]
list2 = [13, 15, 20]
pos2 = {x: i for i, x in enumerate(list2)}
p1, p2 = next((i, pos2[x]) for i, x in enumerate(list1) if x in pos2)

Ensuite, vous pouvez utiliser une compréhension de liste pour obtenir les éléments "tournés" de list2 en utilisant modulo % pour "boucler" lorsque l'index est plus grand que la longueur de la liste.

n = len(list2)
res = [list2[(i+p2-p1) % n] for i in range(n)]
print(res) # [20, 13, 15]
1
tobias_k 28 août 2020 à 16:50

Ce code obtient la valeur et l'index du nombre dans list1 qui existe également dans list2.

list1 = [26, 45, 15]
list2 = [13, 15, 20]

index, number = next((idx,number) for idx, number in enumerate(list1) if number in list2)

Ensuite, il supprime le numéro de list2 et l'insère à nouveau à l'index souhaité:

list2.remove(number)
list2.insert(index,number)

print(list2)

La sortie sera

[13, 20, 15]
0
andy meissner 28 août 2020 à 17:03