对于模糊的标题感到抱歉,但很难简洁地解释。
基本上,假设我有一个列表(在Python中),如下所示:
['a', 'b', 'c\nd', 'e', 'f\ng', 'h', 'i']
由此,我想得到这个:
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
我想这样做的一种方法是使用reduce
,如下所示:
reduce(lambda x, y: x + y.split('\n'), lst, [])
但我不认为这是非常有效的,因为它没有利用我们知道每个第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
...
我们可以拥有任意数量的字段名称,并且总是会有相同数量的值作为字段名称。请注意,我们可以在值中添加新行。我们只知道将由' |'分开。所以我们可以
Value 1|This is an long
value that extends over multiple
lines|Value 3|Value 4
我目前如何做到这一点是通过执行s.split('\n', 2)
,以便我们在自己的字符串中获取字段名称,并在自己的字符串中获取值。然后,在通过' |'拆分值时,我们会得到我最初提到的表单列表。
答案 0 :(得分: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
感谢@Joran Beasley建议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')]
最初看起来像SAS
的数据集,我是对的吗?
答案 1 :(得分:2)
过早优化是万恶之源
如果您实际遇到性能问题,因为此代码只有一件事,但我怀疑您是。
当你优化时,往往会牺牲可读性,如果是我的话,我将会做什么
list(itertools.chain(*[item.split() for item in lst]))
非常清楚你在做什么