リスト A とリスト B には対応する要素があります。
A = ['a','c','b']
B = [5,7,9]
A の要素を並べ替え (以下のように A_sorted を取得する)、B の値を変更しない (以下のように B_sorted を取得する) 方法は?
A_sorted = A.sort()
A_sorted = ['a','b','c']
B_sorted = [5,9,7]
A = ['a','c','b']
B = [5,7,4]
A_sorted, B_sorted = zip(*sorted(zip(A, B))
結果:
>>> A_sorted
('a', 'b', 'c')
>>> B_sorted
(5, 4, 7)
説明:
>>> step_1 = zip(A,B) # creates list of tuples using
# two original lists
# tuples will allow us to keep correspondence
# between A and B
>>> step_1
[('a', 5), ('c', 7), ('b', 4)]
>>> step_2 = sorted(step_1) # key step: the tuples are sorted by
# the first value.
>>> step_2
[('a', 5), ('b', 4), ('c', 7)]
>>> step_3 = zip(*step_2) # This is just a trick to get back the original
# "lists", however they are actually tuples
>>> step_3
[('a', 'b', 'c'), (5, 4, 7)]
質問にタグが付けられているため、厄介な解決策です。使用argsort
:
s = A.argsort()
A_sorted = A[s]
B_sorted = B[s]
使い方:
A = np.array(['a', 'c', 'b'])
B = np.array([5, 7, 9])
s = A.argsort() # returns the _indices_ that would sort A
print s
# array([0, 2, 1])
を使用して、またはs
からソートされたリストを、をソートする順序で取得できます。A
B
A
A[s]
# array(['a', 'b', 'c'],
# dtype='|S1')
B[s]
# array([5, 9, 7])
このlist.sort()
関数はソートされたリストを返しませんが、リストをその場でソートします。したがって、 が返さNone
れるので、 に設定A_sorted
していNone
ます。
ここには 2 つのオプションがあります。
使用するsorted()
場所で使用してくださいA.sort()
。これはリストをソートしますが、ソートされたリストも返します。
何にも割り当てないでくださいA.sort()
。
あなたが探していると思うのは、 andを変更せずにA_sorted
andを作成することです。次に、ここで使用します:B_sorted
A
B
sorted()
A_sorted = sorted(A)
B_sorted = sorted(B)