在Python 3中连接序列的首选方法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (79)

在Python 3中连接序列的首选方法是什么?

现在,我正在做:

import functools
import operator

def concatenate(sequences):
    return functools.reduce(operator.add, sequences)

print(concatenate([['spam', 'eggs'], ['ham']]))
# ['spam', 'eggs', 'ham']

需要导入两个单独的模块才能做到这一点似乎很笨拙。

另一种选择可能是:

def concatenate(sequences):
    concatenated_sequence = []
    for sequence in sequences:
        concatenated_sequence += sequence
    return concatenated_sequence

但是,这是不正确的,因为您不知道序列是列表。

你可以这样做:

import copy

def concatenate(sequences):
    head, *tail = sequences
    concatenated_sequence = copy.copy(head)
    for sequence in sequences:
        concatenated_sequence += sequence
    return concatenated_sequence

但这似乎很容易出错 - 直接调用复制?(我知道head.copy()列表和元组的作用,但copy不是序列ABC的一部分,所以你不能依赖它......如果你得到了字符串怎么办?)。你必须复制以防止变异,以防万一你被交给a MutableSequence。此外,此解决方案强制您首先解压缩整个序列集。再试一次:

import copy 

def concatenate(sequences):
    iterable = iter(sequences)
    head = next(iterable)
    concatenated_sequence = copy.copy(head)
    for sequence in iterable:
        concatenated_sequence += sequence
    return concatenated_sequence
提问于
用户回答回答于

使用itertools.chain.from_iterable

import itertools

def concatenate(sequences):
    return list(itertools.chain.from_iterable(sequences))

list只有当您需要一个实际的新列表时才需要调用,所以如果您只是迭代这个新序列一次就跳过它。

用户回答回答于

出什么问题了:

from itertools import chain
def chain_sequences(*sequences):
  return chain(*sequences)

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动