【问题标题】:Creating multi line text string from list of lists从列表列表创建多行文本字符串
【发布时间】:2015-08-25 19:12:57
【问题描述】:

我有一个预先存在的函数来解析 html 表的数据。

def parse_table(lines):
       .......

我希望能够重用这个函数,但为了做到这一点,我必须提供“lines”变量,它是多行文本字符串的格式,如下所示:

a
b
c
d
e
f
.....

所有字母都是文本字符串。

到目前为止,我已经能够将表格解析为列表列表(每个列表代表一行),如下所示:

  [[u'a',u'b',u'c'],[u'd',u'e',u'f'],...]

如何将我的列表转换为所需的格式?

【问题讨论】:

  • 你需要什么格式,你期望的输出是什么?
  • 那么,您想将 2D list 转换为格式化的 HTML 表格吗?
  • 从您的示例中不清楚预期的输出是什么。这是否归结为展平列表列表,然后用换行符加入内容?如果是这样,只需阅读有关扁平化列表的许多问题(12 等),然后使用join

标签: python


【解决方案1】:

一个快速的单行将产生你的字符串。

table = [[u'a1',u'b2',u'c3'],[u'd4',u'e5',u'f6'],...]
lines = "\n".join(sum(table, [])) + "\n" # if you want a trailing newline

如果您不喜欢使用sum 通过“添加”列表来展平列表列表,则可以使用列表推导式。 (这也比使用sum 快得多。)

lines = "\n".join([item for row in table for item in row])

最快的技术似乎是

lines = "\n".join(list(itertools.chain.from_iterable(table))

这几乎是列表解析的两倍,但在 Python 2.6 中不可用(尽管itertools.chain(*table)) 可以代替它)。

【讨论】:

  • 谢谢,我已经阅读了docs.python.org/2/library/functions.html#sum,但我可以请您讨论一下答案中的“sum(table, [])”部分吗?
  • 所做的只是连接table 中的所有个人lists。 sum() 不会自动检测到您要添加的内容,因此您必须明确告诉它以空的 list ([]) 开头,而不是默认的 (0)。
  • 使用sum 是一种边界线黑客;它之所以有效,是因为 + 被定义为列表的串联,但您并不认为列表是可以总结的东西。
  • 由于@ryachza 的回答因性能而受到批评,我觉得这个答案的sum 部分也值得这样批评:mathieularose.com/how-not-to-flatten-a-list-of-lists-in-python 不管怎样,这是我今天学到的一个很酷的技巧。跨度>
  • 另一个答案牺牲性能只是为了降低可读性。这个答案没有。 (不过,我可能会为此使用 itertools.chain。)
猜你喜欢
  • 2011-04-20
  • 2016-07-09
  • 1970-01-01
  • 2014-02-10
  • 2016-05-14
  • 2016-02-13
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多