分割每个第n个字符串元素并合并到数组的最佳方法是什么?

mp9*_*p94 5 python list

对于模糊的标题感到抱歉,但很难简洁地解释.

基本上,假设我有一个列表(在Python中),如下所示:

['a', 'b', 'c\nd', 'e', 'f\ng', 'h', 'i']
Run Code Online (Sandbox Code Playgroud)

从那以后,我想得到这个:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
Run Code Online (Sandbox Code Playgroud)

我想这样做的一种方法是这样使用reduce:

reduce(lambda x, y: x + y.split('\n'), lst, [])
Run Code Online (Sandbox Code Playgroud)

但我不认为这是非常有效的,因为它没有利用我们知道每个第n个元素都有分隔符的事实.有什么建议?

编辑:有关如何构造数组的更多背景,这可能是问题所在.

我的表格中有文字:

Ignorable line
Field name 1|Field name 2|Field name 3|Field name 4
Value 1|Value 2|Value 3|Value 4
Value 1|Value 2|Value 3|Value 4
...
Run Code Online (Sandbox Code Playgroud)

我们可以拥有任意数量的字段名称,并且总是会有相同数量的值作为字段名称.请注意,我们可以在值中添加新行.我们只知道将用'|'分隔.所以我们可以

Value 1|This is an long
value that extends over multiple
lines|Value 3|Value 4
Run Code Online (Sandbox Code Playgroud)

我目前如何做到这一点是通过这样做s.split('\n', 2),我们得到他们自己的字符串中的字段名称,以及他们自己的字符串中的值.然后,当用"|"拆分值时,我们得到我最初提到的表单列表.

CT *_*Zhu 10

你可以做到('\n'.join(lst)).split()第二个清单.

In [17]:

%timeit reduce(lambda x, y: x + y.split('\n'), lst, [])
100000 loops, best of 3: 9.64 µs per loop
In [18]:

%timeit ('\n'.join(lst)).split() 
1000000 loops, best of 3: 1.09 µs per loop
Run Code Online (Sandbox Code Playgroud)

由于@Joran比斯利的暗示split()split('\n')!

编辑

现在我看到你更新的问题,我想我们可以避免在开始时遇到这种情况,看(使用re):

In [71]:

L=re.findall('([^|]+)\|',
           ''.join(['|'+item+'|' if item.count('|')==3 else item for item in S.split('\n')[1:]])+'|')
In [72]:

zip(*[L[i::4] for i in range(4)]) #4 being the number of fields.
Out[72]:
[('Field name 1', 'Field name 2', 'Field name 3', 'Field name 4'),
 ('Value 1', 'Value 2', 'Value 3', 'Value 4'),
 ('Value 1',
  'This is an longvalue that extends over multiplelines',
  'Value 3',
  'Value 4')]
Run Code Online (Sandbox Code Playgroud)

SAS最初看起来像一个数据集,对吗?