【问题标题】:Interleaving Lists in Python [duplicate]Python中的交错列表[重复]
【发布时间】:2012-06-22 22:09:49
【问题描述】:

我有两个列表:
[a, b, c] [d, e, f]
我要:
[a, d, b, e, c, f]

在 Python 中执行此操作的简单方法是什么?

【问题讨论】:

  • 按那个特定的顺序?还是只是相互附加?您的结果列表有问题。如果您按该顺序需要它们,定义该顺序的规则是什么?
  • @dusan:根本不是那个问题的重复。
  • @eboix:不,这不是简单地连接列表,而是交错它们。
  • @eboix:查看合并列表中元素的顺序。

标签: python list


【解决方案1】:

一种选择是使用chain.from_iterable()zip() 的组合:

# Python 3:
from itertools import chain
list(chain.from_iterable(zip(list_a, list_b)))

# Python 2:
from itertools import chain, izip
list(chain.from_iterable(izip(list_a, list_b)))

编辑:正如 cmets 中的 sr2222 所指出的,这不起作用 好吧,如果列表有不同的长度。在这种情况下,取决于 所需的语义,您可能想要使用(更通用的)roundrobin() 来自recipe section 的函数 itertools 文档:

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).next for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))

【讨论】:

  • +1。可能是最好的解决方案。但可能值得解释一下为什么会这样:压缩给出 [(a, d), (b, e), (c, f)],然后链接将其展平为 [a, d, b, e, c, f ]。 (鼓励人们学习 itertools 总是一件好事。)
  • 如果列表长度不相等,或者至少 +/-1,这会很好吗?
  • @sr2222:好点——它将停在较短的列表上。
  • @sr2222:取决于你所说的“好”是什么意思。如果您在 [1, 2, 3, 4, 5] 和 [6, 7, 8] 上尝试它,您将返回 [1, 6, 2, 7, 3, 8]。这当然是 a 合理的答案,但它可能不适合您的用例。 (而且在不了解您的用例的情况下,任何人都很难说更多。)
  • @abarnert 当然,这取决于用例,只是想为未来阅读此答案的人指出这一点。 :)
【解决方案2】:

您可以使用内置函数做一些简单的事情:

sum(zip(list_a, list_b),())

【讨论】:

  • TypeError: can only concatenate list (not "tuple") to list
  • 这不是加入多个列表的最佳方式。它具有 O(n²) 复杂度,应该避免。
  • @Makoto,类型错误已修复。
  • @sblom:如果列表有 95 个项目,您将连接 95 对。这意味着不断增长的元组将在每一步中被复制。这 is O(n²) 其中 n 是输入列表的长度(假设它们具有相同的长度)。你可以简单地做一些时间来确认这一点。
【解决方案3】:

这是一个使用列表推导的非常简单的方法:

>>> lists = [['a', 'b', 'c'], ['d', 'e', 'f']]
>>> [x for t in zip(*lists) for x in t]
['a', 'd', 'b', 'e', 'c', 'f']

或者,如果您将列表作为单独的变量(如其他答案):

[x for t in zip(list_a, list_b) for x in t]

【讨论】:

  • +1,但与 Sven Marnach 的回答一样,可能值得解释它为什么起作用:压缩列表,然后展平结果。因为对于大多数新用户来说,“[x for t in l for x in t]”的意思是“扁平化 l”并不直观。
  • 也许只是我的偏好,但这个答案对我来说似乎不太复杂。
【解决方案4】:

这个仅适用于 python 2.x,但适用于不同长度的列表:

[y for x in map(None,lis_a,lis_b) for y in x]

【讨论】:

    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 2018-11-21
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多