【发布时间】:2014-04-06 01:20:37
【问题描述】:
抱歉标题含糊不清,但很难简明扼要地解释。
基本上,假设我有一个列表(在 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),以便我们在它们自己的字符串中获取字段名称,并在它们自己的字符串中获取值。然后,当用'|'分割值时,我们得到了我最初提到的形式的列表。
【问题讨论】:
-
你是什么意思每第 n 个元素......看起来你的 n 从 3 变为 2......除了它可能很快......除非它实际上不是,但在那种情况下你会知道那是你的瓶颈....过早的优化是万恶之源
-
在示例中,\n 总是跟在第 3 项之后(c 是字母表的第 3 个字母;f 是第 6 个)。我很好奇是什么导致您以这种格式获取初始列表。如果您更改构建原始列表的方式,也许代码会更清晰......这感觉就像是解析器损坏的解决方法。
-
@ramcdougal 这可能不是构建该列表的最佳方式。我将更新帖子,说明我是如何以这种形式获得的。
-
如果您从一个字符串
s中的行和行开始,为什么不删除换行符,然后在竖线处拆分。类似items=s.replace('\n', ' ').split('|') -
你的意思是 `items=s.replace('\n', ' ').split('|') 吗?因为我按照这些思路做了一些事情,事情变得更快了。谢谢!