第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據(jù)列表中的部分鍵重新排列有序字典

如何根據(jù)列表中的部分鍵重新排列有序字典

暮色呼如 2021-12-17 10:08:45
我正在根據(jù)列表中的鍵重新排列一些有序字典。比如在:old_OD = OrderedDict([('cat_1',1),             ('dog_1',2),             ('cat_2',3),            ('fish_1',4),             ('dog_2',5)])現(xiàn)在我有一個組的訂單列表。order = ['dog', 'cat', 'fish']并獲得將字典中的項目組合在一起的結(jié)果,如下所示:new_OD = OrderedDict([('dog_1',2),            ('dog_2',5),             ('cat_1',1),             ('cat_2',3),            ('fish_1',4)])我發(fā)現(xiàn)了一些很好的相關(guān)問題How to reorder OD based on list和Re-ordering OrderedDict我將使用第二個鏈接中的解決方案new_od = OrderedDict([(k, None) for k in order if k in old_od])new_od.update(old_od)現(xiàn)在,在我的情況下,“k”不是 new_od 的完全匹配和所需的鍵值,我應該如何修改以構(gòu)造新的 od?編輯:那么如果沒有下劃線標記關(guān)鍵字的位置,比如我們有“Big_cat_3”或“dog_black_2”,會發(fā)生什么?關(guān)鍵字可以在字符串中的任何位置。一旦密鑰組合在一起,就不需要字母數(shù)字順序。
查看完整描述

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)])


查看完整回答
反對 回復 2021-12-17
?
LEATH

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)])


查看完整回答
反對 回復 2021-12-17
?
肥皂起泡泡

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)])


查看完整回答
反對 回復 2021-12-17
  • 3 回答
  • 0 關(guān)注
  • 236 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號