将Python列表元素映射到多个元素,避免嵌套列表
这样,我可以通过映射另一个列表中的每个元素来构建一个新列表:将Python列表元素映射到多个元素,避免嵌套列表,python,list,Python,List,这样,我可以通过映射另一个列表中的每个元素来构建一个新列表: # 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+
# 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()
请注意,如果您只想对结果进行迭代,则不必将结果转换为列表,因为
chain.from\u iterable
返回一个迭代器,并且在内存使用方面更加优化。据我所知,列表理解(对于只有一个)一次只能执行一个元素。您可以:
- 展平它(
来自itertools导入链
)
- 使用如下函数并将其用作生成器:
def myFunc(elements):
for elem in elements:
yield -elem
yield elem + 1
您可以使用functools.reduce
(如果您使用的是Python 2.x,则无需导入它):
或者,更妙的是,正如@structmaster所指出的:
flat_list = sum(([-x, x+1] for x in range(0, 20, 5)), [])
请注意,要添加到python中的确切符号是:
此PEP的早期迭代允许将列表、集合和字典理解中的运算符解包为容器可重用上的平坦运算符:
使用此被拒绝的语法,您的案例将如下所示:
[ *(-x,x+1) for x in range(0,20,5) ]
但是,由于列表理解当前一次只支持一个元素,因此您也可以简单地循环其他元素:
[ item for x in range(0,20,5)
for item in (-x,x+1) ]
一个简单的sum
就可以做reduce
所做的事情。@master你绝对正确!很好的提示:)你不需要理解列表;放下支架,将发电机从_iterable
馈送至。
>>> ranges = [range(i) for i in range(5)]
>>> [*item for item in ranges]
[0, 0, 1, 0, 1, 2, 0, 1, 2, 3]
[ *(-x,x+1) for x in range(0,20,5) ]
[ item for x in range(0,20,5)
for item in (-x,x+1) ]