2012-06-05 151 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元素的排序。