2012-06-05 109 views
1

不知是否可以實現在Python以下:返回基於用於獲得這些字典鍵字典的排序迭代

我有一個嵌套的字典nested_dict,其中每個三元素的元組映射(a, b, c)到子字典sub_dict,我有包含所有對應於第二元件的元件彼此列表list_b(即,一種通過b表示)在上面的元組密鑰。

鑑於nested_dictlist_b,以及一個固定的對ac(即,第一和分別元組鍵,第三元件),我想在子字典得到排序迭代基於形成元組鍵的一部分,換句話說,通過使用這個迭代中list_b元件,我可以通過返回的子字典這樣迭代:

nested_dict[(a, b_1, c)], nested_dict[(a, b_2, c)], nested_dict[(a, b_3, c)], ...

wher E,b_1 < b_2 < b_3 ...每個b_ilist_b

我沿着這條思路:

def sorted_dict_itr (nested_dict, list_b, a, c): 
    return (nested_dict[(a, b, c)] for b in sorted(list_b)) 

但這樣做總是由b順序在nested_dict[(a, b, c)]返回一個迭代器?如果是這樣,是否有更有效的方式(意味着更快的代碼)實現相同?

+1

通過「更好」,你在尋找「更高效」,「比較容易理解,而無需意見」,「更地道」,或「少/漂亮代碼」?你有什麼可以工作,而且這對我來說並不糟糕。它可能會更清晰,但更多的代碼來定義一個只生成值的sorted_dict_generator,而不是一個返回生成值的生成器的sorted_dict_itr。它可能(取決於你的大用例)更有效地保留b的排序集合,而不是每次排序list_b。還有要進行很多其他類似的評論,但不知道更多... – abarnert

+0

@abarnert,感謝您的意見。更好的是,我主要是指代碼的效率。除了你已經提到的'已分類收集'以外,這方面有什麼改進? – MLister

回答

1

是的,它的工作原理。

保留一個排序後的集合來代替list_b並在運行中對其進行排序將提高效率 - 但當然這可能會降低其他更重要的地方的效率。

有改善算法的複雜性,字典查找是恆定時間沒有別的辦法,和迭代名單是儘可能快地迭代什麼也可能會被。

您可能能夠通過一個很小的常數因子通過避免需要每個哈希(A,B,C)各種不同的方式的元組加快速度,但我懷疑這會帶來多大的改變。

您可以通過與變量範圍相關的各種微優化,以及是否產生值或返回生成器,來加速少數操作碼,但很難想象這一點很重要。

1

是的,它應該,假設您想要默認sorted()施加的b元素的排序。