J'ai 2 listes:

a=[45, 41, 42, 43, 44]
b=[41, 42, 43, -44, -45]

Je veux trier b en fonction de a sans le signe négatif, donc après le resort ça devrait être comme:

a=[45, 41, 42, 43, 44]
b=[-45, 41, 42, 43, -44]

J'ai essayé de comparer des éléments mais je fais face à un problème en signe négatif

Merci

2
Mostafa Mohamed 6 mars 2016 à 09:41

3 réponses

Meilleure réponse
>>> sorted(b, key=lambda x: a.index(abs(x)))
[-45, 41, 42, 43, -44]

Ou si vous voulez trier b à sa place

b.sort(key=lambda x: a.index(abs(x)))
9
JRodDynamite 6 mars 2016 à 06:49

Vous pouvez utiliser abs pour la valeur absolue.

>>> sorted(map(abs,b),reverse=True)
    [45, 44, 43, 42, 41]
1
Joe T. Boka 6 mars 2016 à 06:49

La réponse ci-dessus est élégante et concise.

Cependant, si vous travaillez sur des listes plus importantes, vous pouvez envisager d'utiliser un dictionnaire de positions pour empêcher les appels à l'indexation.

La complexité resterait à O (n log n) vs O (n ^ 2 log n)

a=[45, 41, 42, 43, 44]
b=[41, 42, 43, -44, -45]


# populate dictionary to reduce number of array scans
keys = {}
for x in xrange(len(a)):
  keys[a[x]] = x

# key is position in a, or -1
def key(x):
  x = abs(x)
  if x in keys:
    return keys[x]
  return -1

b.sort(key = key)

print b
2
Rob 6 mars 2016 à 07:32