在理解中链接生成器
Chaining generators within a comprehension
是否可以在 python 中将类似下面的内容作为单行代码执行,其中生成的语法是可读的?
d = dict((i,i+1) for i in range(10))
d.update((i,i+2) for i in range(20,25))
这个怎么样:
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}
>>> 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}
@jamylak 的回答很好,应该做。无论如何,对于这个特定问题,我可能会这样做:
d = dict((i, i+1) if i < 10 else (i, i+2) for i in range(25) if i < 10 or i >= 20)
这给出了相同的输出:
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)
但它稍微长了一点,它假设你的意图是使用平滑的增量,以后可能不是这种情况(?)。问题是不知道您是否打算将其扩展为更长的表达式,这会改变要求并影响最方便的答案。
是否可以在 python 中将类似下面的内容作为单行代码执行,其中生成的语法是可读的?
d = dict((i,i+1) for i in range(10))
d.update((i,i+2) for i in range(20,25))
这个怎么样:
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}
>>> 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}
@jamylak 的回答很好,应该做。无论如何,对于这个特定问题,我可能会这样做:
d = dict((i, i+1) if i < 10 else (i, i+2) for i in range(25) if i < 10 or i >= 20)
这给出了相同的输出:
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)
但它稍微长了一点,它假设你的意图是使用平滑的增量,以后可能不是这种情况(?)。问题是不知道您是否打算将其扩展为更长的表达式,这会改变要求并影响最方便的答案。