说我有一个str
数组:
['12.5', '7', '45', '\n', '13.7', '52', '34.3', '\n']
我希望按值将其拆分,在本例中为'\n'
,因此它变为:
[['12.5', '7', '45'],
['13.7', '52', '34.3']]
我不想枚举每个元素,因为当输入具有大规模时耗时。所以我想知道是否有一些功能或python技巧可以很容易地实现这一点。
P.S。
我看过this question,但没有多大帮助。主要是因为我不太了解np.where()
如何与np.split()
一起使用,也因为我正在处理str
类型。
另一件事可能有用的是我的最终目标是生成一个数字矩阵(可能是float
类型),所以我也很高兴知道是否有任何numpy函数可以做到这一点。
答案 0 :(得分:2)
你可以使用itertools.groupby
,当然,它会迭代列表,但是经过高度优化:
from itertools import groupby
l = ['12.5', '7', '45', '\n', '13.7', '52', '34.3', '\n']
[list(g) for k, g in groupby(lst, '\n'.__eq__) if not k]
# [['12.5', '7', '45'], ['13.7', '52', '34.3']]
或者,使用浮动转换:
[list(map(float, g)) for k, g in groupby(lst, '\n'.__eq__) if not k]
# [[12.5, 7.0, 45.0], [13.7, 52.0, 34.3]]
答案 1 :(得分:1)
使用numpy
:
rows = np.split(z, np.where(arr == '\n')[0] + 1)[:-1]
mat = np.array(rows).astype(np.float)
或者,如果我们确定要处理矩阵,您只需搜索第一次出现的'\n'
,重新整形并使用它进行切片。
first = np.argmax(arr == '\n')
mat = arr.reshape(-1, first + 1)[:, 0:first].astype(np.float)
可能更快。
答案 2 :(得分:0)
我曾经为此做过一件事。一个chunking模块。它的工作方式类似于str.split
pip install chunking
然后
>>> from chunking import split
>>> a_list = ["foo", 'bar', 'SEP', 'bacon', 'eggs']
>>> split(a_list, 'SEP')
[['foo', 'bar'], ['bacon', 'eggs']]
还有chunking.iter_split
,这是它的生成变体。