我收到一個帶有兩個鍵的字典,其中包含串列作為值。例子:
dict = {'points' : [[2,1],[3,4], [5,6],[7,8]], 'ids':[[2], [1], [3], [0]]}
每個點都有一個與之關聯的 id,例如:點 [2,1] 具有 id[2],點 [3,4] 具有 id[1] 等。
我需要根據每個 id 對點進行排序。所以我需要的輸出是這樣的
dict = {'points' : [[7,8],[3,4], [2,1],[5,6]], 'ids':[[0], [1], [2], [3]]}
我怎樣才能做到這一點?
謝謝。
uj5u.com熱心網友回復:
試試這個:
d['ids'], d['points'] = map(list, zip(*sorted(zip(d['ids'], d['points']))))
請不要使用內置函式名稱(例如dict)來命名變數。這里我用了d。
正如凱利在下面的評論中所建議的,這也是一種選擇:
d['ids'][:], d['points'][:] = zip(*sorted(zip(d['ids'], d['points'])))
uj5u.com熱心網友回復:
Python 可以在一行中做到這一點:
>>> d = {'points' : [[2,1],[3,4], [5,6],[7,8]], 'ids':[[2], [1], [3], [0]]}
>>> d['ids'], d['points'] = zip(*sorted(zip(d['ids'], d['points'])))
>>> d
{'points': ([7, 8], [3, 4], [2, 1], [5, 6]), 'ids': ([0], [1], [2], [3])}
該壓縮步驟所帶來的IDS和點一起成對。的排序由步驟訂單ID,其是每對中的第一個元素。該zip(*s)步驟將ids和點分開,然后點回到單獨的序列中。
請注意,內部資料型別已從串列轉換為元組。如果不需要,您可以呼叫list將它們轉換回來。
uj5u.com熱心網友回復:
請不要使用內置名稱作為變數名稱!
data = {'points' : [[2,1],[3,4], [5,6],[7,8]], 'ids':[[2], [1], [3], [0]]}
ids, points = zip(*sorted(zip(data['ids'], data['points'])))
print({
'points': list(points),
'ids': list(ids),
})
# output: {'points': [[7, 8], [3, 4], [2, 1], [5, 6]], 'ids': [[0], [1], [2], [3]]}
首先創建zip物件 - 它代表物件的“對”(如果給出更多引數,則為 n 元組),因此每個點都系結到 id。然后sorted()按第一個元素對它們進行排序,即 id(我們可以傳遞額外的key引數以保持順序相同)。最后,我們將排序結果拆分回兩個陣列(zip再次應用恢復初始配置),將它們分配給變數并創建所需的字典。
uj5u.com熱心網友回復:
純娛樂。您也可以numpy.argsort用于此作業:
import numpy as np
arr = np.hstack([dct['ids'], dct['points']])
arr = arr[np.argsort(arr[:,0])]
dct['ids'], dct['points'] = arr[:, [0]].tolist(), arr[:, 1:].tolist()
輸出:
{'points': [[7, 8], [3, 4], [2, 1], [5, 6]], 'ids': [[0], [1], [2], [3]]}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/404562.html
標籤:
