【问题标题】:A Pythonic way to insert elements of a list into a list of lists? [duplicate]一种将列表元素插入列表列表的 Pythonic 方法? [复制]
【发布时间】:2013-09-10 21:30:20
【问题描述】:

例如:

nodes = [[1, 2],[3, 4]] 
thelist = [[5, 6], [7, 8]]

我如何编码,所以列表将是:

[[1, 2],[3, 4],[5, 6],[7, 8]]

我知道怎么做,但我想要一种优雅的 python 方式。

我的尝试:

for node in nodes:
    thelist.insert(0, node)

我想应该有一种更 Pythonic 的方式来做到这一点。

编辑:顺序很重要(这就是我尝试在索引 0 处插入的原因)。

【问题讨论】:

  • 互联网上的任何 Python 书籍或教程都会教你如何连接列表。顺便说一句,不要在索引0 处使用insertlist。它会导致整个list 被重新分配。列表针对追加而不是前置进行了优化。
  • 估计的 OdraEncoded,我知道如何连接,并且大多数书籍都教授示例,其中包含提到的 post sza 之类的列表。但在这种情况下,我将面对列表列表和列表列表,列表列表中充满了列表,哈哈。而且我找不到像您发布的那样好的答案。编辑:哦,我没有在索引 0 处插入,因为顺序有点重要,我要把它添加到 OP 中。
  • @sza 不是重复的,imo,因为链接问题的正确答案是extend,这里不适用。另外,为什么这被否决了?在这种情况下可能有更好的方法来做到这一点,但这并不会使问题无效。正如标题中所说,这个问题是完全有效的。
  • 除了迭代组合结果之外,您还需要做些什么吗?如果没有,itertools.chain 可能就是您想要的。如果您经常插入并且不需要按索引检索项目,您可能需要collections.deque

标签: python list


【解决方案1】:

只需将它们相加:

In [11]: nodes + thelist
Out[11]: [[1, 2], [3, 4], [5, 6], [7, 8]]

你也可以使用extend(修改节点):

In [12]: nodes.extend(thelist)

In [13]: nodes
Out[13]: [[1, 2], [3, 4], [5, 6], [7, 8]]

【讨论】:

  • 谢谢!尽管所有答案都解决了问题,但这(使用“+”运算符)似乎是最 Pythonic 的。
  • + 运算符返回一个新列表。
【解决方案2】:

您可以分配给切片thelist[:0] 以在开头插入元素:

nodes = [[1, 2],[3, 4]]
thelist = [[5, 6], [7, 8]]
thelist[:0] = nodes
# thelist is now [[1, 2], [3, 4], [5, 6], [7, 8]]

请参阅lots of useful ways to manipulate lists 的 Python 教程。

【讨论】:

  • +1。这分配给一个正是 OP 要求的切片。尽管 OP 要求对 thetist 进行变异,但更常见的模式是创建一个新列表并重新分配给相同的名称:theList = nodes + thelist
  • +1,这是一些我不知道的有趣语法:P
  • 这个解决方案实际上可以在一些书中找到,非常优雅,我想我错过了它,因为我来自其他无法切片的语言。非常感谢。
【解决方案3】:

或者,如果某种顺序很重要,或者只是一次拿一件物品的能力,那么您可以使用heapq.merge

import heapq

nodes = [[1, 2],[3, 4]]
thelist = [[5, 6], [7, 8]] 
res = list(heapq.merge(nodes, thelist))
# [[1, 2], [3, 4], [5, 6], [7, 8]]

nodes = [[1, 2], [5,6]]
thelist = [[3, 4], [7, 8]]    
res = list(heapq.merge(nodes, thelist))
# [[1, 2], [3, 4], [5, 6], [7, 8]]

或者,只需使用:

for heapq.merge(nodes, thelist):

请注意,订单可能与 itertools.chain 不同。

【讨论】:

  • 我很好奇为什么 heapq.merge 超过 itertools.chain。使用一个比另一个有优势吗?
  • @StevenRumbalski 参见第二个示例,列表按排序顺序排列。
  • 确实有用!但我想它不像我问的那样pythonic。
  • @MarceloZárate 如果您想按顺序合并序列,那是完美的 Pythonic ...
  • @MarceloZárate:Jon Clements 超过 30k 的声誉来自回答 Python 问题。默认情况下,您可能应该首先问自己为什么他认为他的答案是 Pythonic。 (注意——我并不是说高声誉的回答者是绝对可靠的,但他们通常是一个很好的来源。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
相关资源
最近更新 更多