合并一个列表的列表

7
如何合并一个列表的列表?
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]

进入

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

如果我能在合并列表之前为每个项目的开头和结尾添加一个值,就像HTML标签一样,那就更好了。

也就是说,最终结果将是:

['<tr>A</tr>', '<tr>B</tr>', '<tr>C</tr>', '<tr>D</tr>', '<tr>E</tr>', '<tr>F</tr>', '<tr>G</tr>', '<tr>H</tr>', '<tr>I</tr>']

有没有办法在列表合并之前添加标签?我有点简化了我的问题。 - Steven Matthews
简化你的问题。我不明白如果不知道有什么限制阻止你使用显而易见的解决方案,我们怎么能说如何添加标签。 - Winston Ewert
4个回答

10

不要使用sum(),对于连接列表来说它速度较慢。

相反的,使用嵌套列表推导式即可:

>>> x = [['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]
>>> [elem for sublist in x for elem in sublist]
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
>>> ['<tr>' + elem + '</tr>' for elem in _]

使用itertools.chain的建议也很好。


4
import itertools

print [('<tr>%s</tr>' % x) for x in itertools.chain.from_iterable(l)]

你可以使用sum,但我认为这有点丑陋,因为你必须传递[]参数。正如Raymond指出的那样,这也会很昂贵。所以不要使用sum。


2
itertools的建议很好,但sum()的建议不是。后者是一个O(n*n)的操作 :-( - Raymond Hettinger
@Raymond:如果左操作数的引用计数为1,修改列表的“+”运算符以原地工作是否可能?这样做能将sum()版本的复杂度降低到O(n)吗? - Sven Marnach
2
Sven,这可能行得通,但我认为Guido不会有兴趣支持它——他已经拒绝了使用sum()的''.join()风格逻辑来对字符串求和。 - Raymond Hettinger
@SvenMarnach,实际上,在sum的实现中的注释中提到了进行原地加法的可能性,以精确消除这里的二次行为。它指出,实际上没有进行优化,因为这将最终修改第二个参数以进行求和。 - Winston Ewert
@Winston:我不会在sum()中这样做,我会在列表的+运算符中这样做,而且只有当列表的引用计数为1时才这样做。这意味着sum(list_of_lists, [])是经过优化的--我们可以修改sum()的第二个参数--而a = []; sum(list_of_lists, a)没有经过优化--我们不能修改a - Sven Marnach
显示剩余3条评论

2
使用 itertools.chain
>>> import itertools
>>> list(itertools.chain(*mylist))
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

将元素包装在HTML中可以在之后完成。
>>> ['<tr>' + x + '</tr>' for x in itertools.chain(*mylist)]
['<tr>A</tr>', '<tr>B</tr>', '<tr>C</tr>', '<tr>D</tr>', '<tr>E</tr>', '<tr>F</tr>',
'<tr>G</tr>', '<tr>H</tr>', '<tr>I</tr>']

请注意,如果您正在尝试生成有效的HTML,则可能还需要对字符串中的某些内容进行HTML转义

2

要将列表连接起来,您可以使用sum函数。

values = sum([['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']], [])

为了添加HTML标签,您可以使用列表推导式。
html_values = ['<tr>' + i + '</tr>' for i in values]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接