我想根據其中一個列表排序詞典(它們是列表)的值。例如說我有詞典:基於列表排序詞典的值
data = {'AttrA':[2,4,1,3],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}
,我想這個排序基於與ATTRA關聯的值,使得:
data = {'AttrA':[1,2,3,4],'AttrB':[23,12,25,43],'AttrC':['f','a','z','d']}
預先感謝您!
我想根據其中一個列表排序詞典(它們是列表)的值。例如說我有詞典:基於列表排序詞典的值
data = {'AttrA':[2,4,1,3],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}
,我想這個排序基於與ATTRA關聯的值,使得:
data = {'AttrA':[1,2,3,4],'AttrB':[23,12,25,43],'AttrC':['f','a','z','d']}
預先感謝您!
排序在字典中的每個值基於data['AttrA']
源列表上,在短短的3行代碼使用sorted()
和zip()
,所有:
base = data['AttrA'] # keep a reference to the original sort order
for key in data:
data[key] = [x for (y,x) in sorted(zip(base, data[key]))]
演示:
>>> data = {'AttrA': [2, 4, 1, 3], 'AttrB': [12, 43, 23, 25], 'AttrC': ['a', 'd', 'f', 'z']}
>>> base = data['AttrA']
>>> for key in data:
... data[key] = [x for (y,x) in sorted(zip(base, data[key]))]
...
>>> data
{'AttrB': [23, 12, 25, 43], 'AttrC': ['f', 'a', 'z', 'd'], 'AttrA': [1, 2, 3, 4]}
這是優雅的......如此優雅 – inspectorG4dget
未經檢驗的,但應工作(或至少是開始的好地方)
data = {'AttrA':[2,4,1,3],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}
sortkey = 'AttrA'
sortedval = sorted(data['AttrA'])
valmaps = {i:sortedvals.find(num) for i,num in enumerate(data['AttrA'])}
newData = {k:[v[valmaps[i]] for i,_num in enumerate(v)] for k,v in data.items()}
希望這有助於
如果data ['AttrA']'包含非唯一值,但其他列表會這樣做,這將失敗。 ''AttrA':[2,4,1,4]'表示你的'valmaps'字典將有'1'和'3'映射到'3'。 –
真的!我沒有考慮過 – inspectorG4dget
from operator import itemgetter
data = {'AttrA':[2,4,1,3],'AttrB':[12,43,23,25],'AttrC':['a','d','f','z']}
sort = itemgetter(*[i for i, v in sorted(enumerate(data['AttrA']), key=itemgetter(1))])
data = dict((k, list(sort(v))) for k, v in data.items())
或創建sort
的短,但效率較低的方法:
sort = itemgetter(*[data['AttrA'].index(v) for v in sorted(data['AttrA'])])
結果:
>>> data
{'AttrB': [23, 12, 25, 43], 'AttrC': ['f', 'a', 'z', 'd'], 'AttrA': [1, 2, 3, 4]}
這使用operator.itemgetter
創建從抓項目分類功能按data['AttrA']
確定的順序排序,然後將該排序函數應用於字典中的每個值。
簡化問題。它與字典無關,而是「如何對列表進行排序,然後根據排序後的位置對其他列表進行映射?」 (或者,也許「我怎樣才能根據另一個列表對列表進行排序?」) – user2246674
排序第一個列表,從中創建一個索引列表;將索引應用於其餘列表。除非你很聰明,否則你可能必須複製列表。 – Jiminion
問題很簡單。 – Jiminion