gpt4 book ai didi

python-3.x - Python 3 中连接序列的首选方法是什么?

转载 作者:行者123 更新时间:2023-12-02 22:53:51 24 4
gpt4 key购买 nike

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 的一部分,所以你不能依赖它......如果你收到字符串怎么办?)。如果您收到 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

但是拜托...这是Python!那么...执行此操作的首选方法是什么?

最佳答案

我会使用itertools.chain.from_iterable()相反:

import itertools

def chained(sequences):
return itertools.chain.from_iterable(sequences):

或者,因为您用 标记了它您可以使用新的 yield from语法(看吧,没有导入!):

def chained(sequences):
for seq in sequences:
yield from seq

它们都返回迭代器(如果您必须具体化完整列表,请在它们上使用list())。大多数时候,您不需要从连接序列构造一个全新的序列,实际上,您只想循环它们来处理和/或搜索某些内容。

请注意,对于字符串,您应该使用 str.join()而不是我的答案或您的问题中描述的任何技术:

concatenated = ''.join(sequence_of_strings)

结合起来,为了快速处理序列并且正确,我会使用:

def chained(sequences):
for seq in sequences:
yield from seq

def concatenate(sequences):
sequences = iter(sequences)
first = next(sequences)
if hasattr(first, 'join'):
return first + ''.join(sequences)
return first + type(first)(chained(sequences))

这适用于元组、列表和字符串:

>>> concatenate(['abcd', 'efgh', 'ijkl'])
'abcdefghijkl'
>>> concatenate([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> concatenate([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
(1, 2, 3, 4, 5, 6, 7, 8, 9)

并对字符串序列使用更快的''.join()

关于python-3.x - Python 3 中连接序列的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14342242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com