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

时间:2016-07-23 22:44:59

标签: python list numpy

我有以下列表:

[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时间间隔值,并且使用我的浮点值时,我无法添加:分隔符。谁能指出我正确的方向?

2 个答案:

答案 0 :(得分:3)

您不能使用:分隔的数字,而不用""包裹它们(即作为字符串)。但是,您可以使用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.])

产生您想要的结果。

答案 1 :(得分:2)

我认为你在谈论:

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)r_然后将其转换为arange(a,b,c),然后将其连接起来。

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