3 回答

TA貢獻1786條經(jīng)驗 獲得超13個贊
在這里,我將為此分享兩種解決方案。
1.對于相同前綴的key,保持initial的順序OrderedDict
在這里,我使用列表理解來迭代order列表和OrderDict. 基于比較,我們傳遞具有創(chuàng)建OrderedDict對象所需順序的元組列表:
>>> from collections import OrderedDict
>>> old_OD = OrderedDict([('cat_1',1),
... ('dog_1',2),
... ('cat_2',3),
... ('fish_1',4),
... ('dog_2',5)])
>>> order = ['dog', 'cat', 'fish']
>>> new_OD = OrderedDict([(k,v) for o in order for k, v in old_OD.items() if k.startswith(o+'_')])
# to match the prefix pattern of <key> + "_" ^
在哪里new_OD舉行:
OrderedDict([('dog_1', 2), ('dog_2', 5), ('cat_1', 1), ('cat_2', 3), ('fish_1', 4)])
2.對于相同前綴的key,對元素進行字典序排序
我們可以使用sorted和itertools.chain使用嵌套列表理解來修改上述解決方案,以實現(xiàn)這一點:
>>> from itertools import chain
>>> new_OD = OrderedDict(chain(*[sorted([(k,v) for k, v in old_OD.items() if k.startswith(o+'_')]) for o in order]))
在哪里new_OD舉行:
OrderedDict([('dog_1', 2), ('dog_2', 5), ('cat_1', 1), ('cat_2', 3), ('fish_1', 4)])

TA貢獻1936條經(jīng)驗 獲得超7個贊
您可以構(gòu)建一個將每個項目映射order到其索引的字典,然后將該sorted函數(shù)與一個鍵函數(shù)一起使用,該函數(shù)使用old_OD映射字典將出現(xiàn)在映射字典的鍵中的每個鍵的子字符串映射到相應的索引:
keys = {k: i for i, k in enumerate(order)}
OrderedDict(sorted(old_OD.items(), key=lambda t: keys.get(next(i for i in t[0].split('_') if i in keys))))
這將返回:
OrderedDict([('dog_1', 2), ('dog_2', 5), ('cat_1', 1), ('cat_2', 3), ('fish_1', 4)])

TA貢獻1829條經(jīng)驗 獲得超6個贊
以O(shè)(n)的時間復雜度(而不是O(n log n)排序)解決此問題的更有效方法是構(gòu)建一個 dict 來映射出現(xiàn)在的每個鍵的子字符串order(應轉(zhuǎn)換為用于高效查找的集合)到從屬于的鍵值對列表old_OD,然后OrderedDict通過迭代索引的長度范圍order來OrderedDict構(gòu)建新的,并將映射字典中的值輸出到構(gòu)造函數(shù),由orderat的值鍵控指數(shù):
keys = set(order)
mapping = {}
for k, v in old_OD.items():
mapping.setdefault(next(i for i in k.split('_') if i in keys), []).append((k, v))
OrderedDict(t for i in range(len(order)) for t in mapping[order[i]])
這將返回:
OrderedDict([('dog_1', 2), ('dog_2', 5), ('cat_1', 1), ('cat_2', 3), ('fish_1', 4)])
添加回答
舉報