Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python列表元素映射到多个元素,避免嵌套列表_Python_List - Fatal编程技术网

将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) ]