链接发电机内的理解

时间:2015-02-06 09:01:23

标签: python python-2.6

是否可以在python中执行类似以下内容的操作,其结果语法是可读的?

d = dict((i,i+1) for i in range(10))
d.update((i,i+2) for i in range(20,25))

4 个答案:

答案 0 :(得分:5)

>>> from itertools import chain
>>> dict(chain(((i,i+1) for i in range(10)), 
               ((i,i+2) for i in range(20,25))))
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 20: 22, 21: 23, 22: 24, 23: 25, 24: 26}

答案 1 :(得分:0)

怎么样:

d = dict(dict((i,i+1) for i in range(10)), **dict(((i,i+2) for i in range(20,25))))

结果:

{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 20: 22, 21: 23, 22: 24, 23: 25, 24: 26}

答案 2 :(得分:0)

@jamylak的答案很棒,应该这样做。无论如何,对于这个具体问题,我可能会这样做:

d = dict((i, i+1) if i < 10 else (i, i+2) for i in range(25) if i < 10 or i >= 20)

答案 3 :(得分:0)

这给出了相同的输出:

d = dict((i,i+x) for x,y in [(1, range(10)), (2, range(20,25))] for i in y)

你也可以用enumerate来编写它,所以:

d = dict((i,i+x) for x,y in enumerate([range(10), range(20,25)], 1) for i in y)

但是它稍微长一些,它假设你的意图是使用平滑增量,这可能不是以后的情况(?)。问题是不知道你是否打算将它扩展为更长的表达式,这会改变要求并影响哪个答案最方便。