使用分隔符python合并列表中的项



我有以下列表:

[50.0, 100.0, 150.0, 5.0, 200.0, 300.0, 10.0, 400.0]

我想使用:分隔符合并列表中的项目,以创建以下列表:

[50.0, 100.0:150.0:5, 200.0:300.0:10.0, 400.0]

我想使用numpy.r_中的新列表。我已经将我的列表从字符串转换为浮动,所以我想保留浮动,只在适当的索引之间添加:分隔符。我遇到的问题是,如果我想要浮点值,我无法转换100.0:150.0:5间隔值,并且使用浮点值时,我在添加:分隔符时遇到了问题。有人能给我指正确的方向吗?

如果不将数字用""包装(即字符串),就不能用:分隔数字。但是,您可以使用slice:执行您想要的操作

s = [50.0, 100.0, 150.0, 5.0, 200.0, 300.0, 10.0, 400.0]
it = iter(s[1:-1])
s[1:-1] = map(slice, *(it,)*3)
print(s)
# [50.0, slice(100.0, 150.0, 5.0), slice(200.0, 300.0, 10.0), 400.0]

现在可以与np.r_np.concatenate一起使用,如下所示:

>>> np.concatenate([np.r_[i] for i in s])
array([  50.,  100.,  105.,  110.,  115.,  120.,  125.,  130.,  135.,
        140.,  145.,  200.,  210.,  220.,  230.,  240.,  250.,  260.,
        270.,  280.,  290.,  400.])

从而产生您想要的结果。

我想你说的是做:

In [152]:  [50.0, 100.0, 150.0, 5.0, 200.0, 300.0, 10.0, 400.0]
Out[152]: [50.0, 100.0, 150.0, 5.0, 200.0, 300.0, 10.0, 400.0]
In [153]: np.r_[50.0, 100.0:150.0:5.0, 200.0:300.0:10.0, 400.0]
Out[153]: 
array([  50.,  100.,  105.,  110.,  115.,  120.,  125.,  130.,  135.,
        140.,  145.,  200.,  210.,  220.,  230.,  240.,  250.,  260.,
        270.,  280.,  290.,  400.])

我在ipython编辑器中添加了:。我并不是真的在做字符串运算,例如np.r_['50.0', '100.0:150.0:5.0',...]

等效表达式使用slice:

np.r_[50.0, slice(100.0,150.0,5.0), slice(200.0,300.0,10.0), 400.0]

或者如果列表是ll:

np.r_[ll[0], slice(*ll[1:4]), slice(*ll[4:7]), ll[7]]

在索引上下文[]中,a:b:c表达式被转换为切片对象slice(a,b,c)。然后CCD_ 19将其转换为CCD_。

因此r_的有效表达是:

np.concatenate([ [ll[0]], np.arange(*ll[1:4]), np.arange(*ll[4:7]), [ll[7]] ])

一种将中间值分组为3并将其放入切片的方法是:

In [166]: [slice(*ii) for ii in np.array(ll[1:-1]).reshape(-1,3)]
Out[166]: [slice(100.0, 150.0, 5.0), slice(200.0, 300.0, 10.0)]

(这是对@Moses使用iter的替代)。但是在np.r_(甚至np.concatenate)中嵌入这种列表是很棘手的。

直接生成arange可能更容易:

In [189]: subl = [np.arange(*ii) for ii in np.array(ll[1:-1]).reshape(-1,3)]
In [190]: subl
Out[190]: 
[array([ 100.,  105.,  110.,  115.,  120.,  125.,  130.,  135.,  140.,  145.]),
 array([ 200.,  210.,  220.,  230.,  240.,  250.,  260.,  270.,  280.,  290.])]
In [191]: np.concatenate([[ll[0]]]+subl+[[ll[-1]]])
Out[191]: 
array([  50.,  100.,  105.,  110.,  115.,  120.,  125.,  130.,  135.,
        140.,  145.,  200.,  210.,  220.,  230.,  240.,  250.,  260.,
        270.,  280.,  290.,  400.])

最新更新