这样我就可以通过映射另一个列表中的每个元素来构建一个新列表:
# turn [0,5,10,15] into [1,6,11,16]
[ x+1 for x in range(0,20,5) ]
但我希望每个元素在我的新列表中产生两个元素。我怎样才能做到这一点?这是我的尝试:
# turn [0,5,10,16] into [0,1,-5,6,-10,11,-15,16]
# does not work! gives [[0,1],[-5,6],[-10,11],[-15,16]]
[ [-x,x+1] for x in range(0,20,5) ]
# turn [0,5,10,16] into [0,1,-5,6,-10,11,-15,16]
# does not work! gives [(0,1),(-5,6),(-10,11),(-15,16)]
[ (-x,x+1) for x in range(0,20,5) ]
当然,我可以创建列表的列表,然后以某种方式将其展平,但有没有更简洁的方法?
请您参考如下方法:
你需要使用两个循环:
>>> [t for x in range(0,20,5) for t in [-x,x+1] ]
[0, 1, -5, 6, -10, 11, -15, 16]
或者,如果您要处理更大的数据集,您可以使用 itertools.chain()
>>> from itertools import chain
>>>
>>> list(chain.from_iterable([-x,x+1] for x in range(0,20,5)))
[0, 1, -5, 6, -10, 11, -15, 16]
>>>
请注意,如果您只想遍历结果,则不必将结果转换为列表,因为 chain.from_iterable 返回一个迭代器,并且在内存使用方面进行了相当多的优化.
