【问题标题】:Dictionary comprehension using range() with step使用 range() 和 step 进行字典理解
【发布时间】:2021-06-02 19:04:54
【问题描述】:

我正在尝试使用 Python 2.7 中的字典理解来构建字典。我想使用具有开始和停止值以及步长的 range() 函数作为循环变量。代码如下:

{ i: i*2 for i in range(0, 50, 5) }

当我在我的 REPL 中运行它时,我得到以下输出:

{0: 0, 35: 70, 5: 10, 40: 80, 10: 20, 45: 90, 15: 30, 20: 40, 25: 50, 30: 60}

如您所见,这些值并非按预期升序排列。

谁能告诉我我做错了什么?非常感谢您的帮助!

【问题讨论】:

  • 欢迎来到 SO!字典在 2.7 中没有排序。升级到 3.6 或使用collections.OrderedDict
  • 为什么要关心订单?键和值是字典中的重要内容。
  • 同意评论员的观点,但主要问题是你为什么使用 python 2.7?
  • @BrownBear 某些环境受到限制,例如为旧版军事软件添加功能
  • 也许您应该发布您要解决的实际问题的代码,因为这听起来像是XY problem

标签: python python-2.7 dictionary


【解决方案1】:

在 Python 2.7 中,您希望使用 xrange 而不是 range 和来自元组的 collections.OrderedDict

  • xrange 是一个序列,可以避免创建中间的list 对象
  • OrderedDicts(可能很明显)是一个保留插入顺序的字典
>>> from collections import OrderedDict
>>> d = OrderedDict((i, i*2) for i in xrange(0, 50, 5))
>>> d
OrderedDict([(0, 0), (5, 10), (10, 20), (15, 30), (20, 40), (25, 50), (30, 60), (35, 70), (40, 80), (45, 90)])
>>> d[5]
10

但是,正如 @Barmar 所指出的,如果您只是查找值,则顺序无关紧要(它的表示方式不一定表明相同的值order 查找起来更快,因为它们在搜索之前已经过哈希处理)。我还没有测试过,但是有一个无序(正常)dict 可能会更高效,这应该是一个 O(1) 查找。

此外,由于 dict 的公式很简单,您可能会更好地在运行时简单地计算它们!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2014-01-17
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多