Mam dwie listy;

A = ['red', 'green', 'blue', 'white', 'black']
B = ['22', '34', '7', '3', '850']

Chciałbym sortować listę b z maksymalnej wartości do wartości minimalnej, a następnie sortować listę A, w oparciu o transformację zastosowaną do listy B. To jest;

A = ['black', 'green', 'red', 'blue', 'white']
B = ['850', '34', '22', '7', '3']
1
p014k 26 styczeń 2015, 17:09

5 odpowiedzi

Najlepsza odpowiedź

Najprostszym sposobem jest zip ich razem, sortuj je przez drugi komponent, a następnie rozpakuj je:

ab = zip(A, B)
ab.sort(key=lambda values: int(values[1]), reverse=True)
A, B = zip(*ab)
5
Daniel Roseman 26 styczeń 2015, 14:12

key Argument można przekazać do sorted Co pozwala na sortowanie na podstawie funkcji. W poniższym przykładzie sortujemy za pomocą Lambda Funkcja, która zwraca drugą wartość Z twoich połączonych krotek przekształconych na liczbę całkowitą.

Należy pamiętać, że istnieje różnica między ciągami sortowania i sortowanie liczb całkowitych, a jako taki musisz konwertować wartości z B za pomocą int, jeśli nie chcesz tego z jakiegoś powodu, możesz usunąć { {X2}} Wezwanie w funkcji Lambda.

A = ['red', 'green', 'blue', 'white', 'black']
B = ['22', '34', '7', '3', '850']

C = zip(A, B)

D = [i for i, _ in sorted(C, key=lambda x:int(x[1]), reverse=True)]

print(D)
# ['black', 'green', 'red', 'blue', 'white']
2
Ffisegydd 26 styczeń 2015, 14:13

Oprócz funkcji wbudowanej zip & AMP; sort As odpowiedział @danielroseman, możesz użyć modułu numpy do sortowania:

In [116]: import numpy as np
     ...: A = ['red', 'green', 'blue', 'white', 'black']
     ...: B = ['22', '34', '7', '3', '850']
     ...: A = np.asarray(A)
     ...: B = np.asarray(B)
     ...: iB = np.asarray(map(int, B))
     ...: idx = iB.argsort()[::-1] #get indices in reverse order
     ...: sa = A[idx]
     ...: sb = B[idx]

In [117]: print sa, sb
['black' 'green' 'red' 'blue' 'white'] ['850' '34' '22' '7' '3']

numpy jest bardziej wydajny, gdy twoje listy do sortowania jest duży rozmiar .

Sprawdzać wydajność:

In [97]: a = np.random.randint(1000, size=10000)
    ...: b = np.random.randint(1000, size=10000)

In [99]: %%timeit
    ...: idx = b.argsort()[::-1]
    ...: sa = a[idx]
    ...: sb = b[idx]
    ...: 
1000 loops, best of 3: 648 µs per loop

In [100]: %%timeit
     ...: ab = zip(a, b)
     ...: ab.sort(key=lambda values: int(values[1]), reverse=True)
     ...: sa, sb = zip(*ab)
     ...: 
100 loops, best of 3: 10.1 ms per loop
1
zhangxaochen 26 styczeń 2015, 14:37
sorted_by_second_list = [x[0] for x in sorted(zip(A,B),key=lambda tup: int(tup[1]))]

Zip utworzy listę Ktorek, używany z Lambda w funkcji Sortuj

0
Hrabal 26 styczeń 2015, 14:16
a=['red','green','blue','white','black']
b=[22,34,7,3,850]
c=zip(a,b)
print c
[('red', 22), ('green', 34), ('blue', 7), ('white', 3), ('black', 850)]
from operator import itemgetter
sorted(c, key=itemgetter(1), reverse=True)
[('black', 850), ('green', 34), ('red', 22), ('blue', 7), ('white', 3)]
-1
hawksbill 26 styczeń 2015, 14:19