使用 range() 和 step 的字典理解
Dictionary comprehension using range() with step
我正在尝试使用 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}
如您所见,这些值并不像人们预期的那样按升序排列。
谁能告诉我我做错了什么?非常感谢您的帮助!
对于 Python 2.7,您想使用来自元组的 xrange
instead of range and a collections.OrderedDict
xrange
是一个序列,避免创建中间 list
对象
OrderedDict
s(可能很明显)是保留插入顺序的字典
>>> 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 指出的那样,顺序 并不重要 如果您只是查找值(它的表示方式不一定表示相同顺序的值查找起来更快,因为它们在搜索之前被散列)。我还没有测试过,但是无序(正常)dict
的性能可能更高,这应该是 O(1) 查找。
此外,由于 dict 的公式很简单,您最好在运行时简单地计算它们!
我正在尝试使用 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}
如您所见,这些值并不像人们预期的那样按升序排列。
谁能告诉我我做错了什么?非常感谢您的帮助!
对于 Python 2.7,您想使用来自元组的 xrange
instead of range and a collections.OrderedDict
xrange
是一个序列,避免创建中间list
对象OrderedDict
s(可能很明显)是保留插入顺序的字典
>>> 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 指出的那样,顺序 并不重要 如果您只是查找值(它的表示方式不一定表示相同顺序的值查找起来更快,因为它们在搜索之前被散列)。我还没有测试过,但是无序(正常)dict
的性能可能更高,这应该是 O(1) 查找。
此外,由于 dict 的公式很简单,您最好在运行时简单地计算它们!