【问题标题】:Return a sorted iterator of dictionaries based on the keys used for obtaining these dictionaries根据用于获取这些字典的键返回字典的排序迭代器
【发布时间】:2012-06-09 19:20:42
【问题描述】:

不知道是否可以在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)], ...

其中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)] 上返回一个迭代器?如果是这样,有没有更有效的方法(意味着更快的代码)来实现相同的目标?

【问题讨论】:

  • 通过“更好”,您是在寻找“更高效”、“更容易理解而不需要 cmets”、“更惯用”还是“更少/更漂亮的代码”?你所拥有的将起作用,而且对我来说似乎并不坏。定义一个仅产生值的 sorted_dict_generator 而不是返回产生值的生成器的 sorted_dict_itr 可能更清晰,但代码更多。保留 b 的排序集合而不是每次排序 list_b 可能(取决于您更大的用例)更有效。还有很多其他这样的 cmets 要做,但不知道更多……
  • @abarnert,感谢 cmets。更好,我主要是指代码的效率。除了您已经提到的“排序集合”之外,在这方面有什么改进吗?

标签: python dictionary


【解决方案1】:

是的,它有效。

保留一个已排序的集合来代替保留 list_b 并对其进行动态排序将提高效率 - 但当然它可能会降低其他更重要的地方的效率。

没有其他方法可以提高算法复杂性 - dict 查找是恒定时间的,迭代列表的速度与迭代任何可能的速度一样快。

您可以通过避免以各种不同的方式对每个 (a, b, c) 元组进行散列处理来加快处理速度,但我怀疑这会产生很大的不同。

您可以通过与变量范围以及是否生成值或返回生成器相关的各种微优化,通过几个操作码来加快速度,但很难想象这会很重要。

【讨论】:

    【解决方案2】:

    是的,它应该,假设您想要默认 sorted() 强加的 b 元素的顺序。

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 2018-01-02
      • 2018-07-08
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      相关资源
      最近更新 更多