Python 如何解开数组?
我需要为Python 如何解开数组?,python,arrays,list,Python,Arrays,List,我需要为scipy.optimize.minimize的边界条件生成一个列表,它应该如下所示: bonds = [(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99), (0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99), (0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),
scipy.optimize.minimize
的边界条件生成一个列表
,它应该如下所示:
bonds = [(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99),
(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99),
(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99),]
我想知道有没有什么优雅的方法
我试过:
bonds = [[(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99)] for i in range(3)]
但这会产生
[[(0.0, 0.99), (-30, 30), (-30, 30), (0.0, 30), (0.0, 30), (-0.99, 0.99)],
[(0.0, 0.99), (-30, 30), (-30, 30), (0.0, 30), (0.0, 30), (-0.99, 0.99)],
[(0.0, 0.99), (-30, 30), (-30, 30), (0.0, 30), (0.0, 30), (-0.99, 0.99)]]
如何删除内部[]
,以将内部数组分解为单个数组?或者还有其他好的方法吗 您可以执行以下操作:
bonds = [(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99)] * 3
[i用于子列表中的子列表,i用于子列表中的子列表]
其他方式,使用fromitertools
模块:
>>> l = [(0.0, 0.99), (-30, 30), (-30, 30), (0.0, 30), (0.0, 30), (-0.99, 0.99)]
>>> bonds = list(itertools.chain.from_iterable(l*3))
>>> bonds
[0.0, 0.99, -30, 30, -30, 30, 0.0, 30, 0.0, 30, -0.99, 0.99, 0.0, 0.99, -30, 30, -30, 30, 0.0, 30, 0.0, 30, -0.99, 0.99, 0.0, 0.99, -30, 30, -30, 30, 0.0, 30, 0.0, 30, -0.99, 0.99]
编辑:比较一些表达式的速度,我尝试了以下方法:
$ python3 -mtimeit -s 'l = [(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99)]' 'bonds=list(itertools.chain.from_iterable(l*3))'
1000000 loops, best of 3: 1.95 usec per loop
$ python3 -mtimeit -s 'l = [(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99)]' 'bonds = l*3'
10000000 loops, best of 3: 0.147 usec per loop
$ python3 -mtimeit -s 'l = [(0., 0.99),(-30, 30),(-30, 30),(0., 30),(0., 30),(-0.99, 0.99)]' 'bonds=list(itertools.chain(l*3))'
1000000 loops, best of 3: 0.859 usec per loop
大家可以注意到,bonds=l*3
是上述表达式中速度最快的一个。请为这个代码段添加一些支持文本。解释为什么它能解决OP的问题。帮助其他人理解。不一定是你想要什么,但可以找到一种方法来平展列表。@Reti43,谢谢,这是思考这个问题的另一种方式。我只是一点也没有想到扁平的。