Python 3でシーケンスを連結するための好ましい方法は何ですか?
今、私はやっています:
import functools
import operator
def concatenate(sequences):
return functools.reduce(operator.add, sequences)
print(concatenate([['spam', 'eggs'], ['ham']]))
# ['spam', 'eggs', 'ham']
これを行うために2つの別々のモジュールをインポートする必要があるのは不格好なようです。
別の方法は次のとおりです。
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です!だから...これを行うための好ましい方法は何ですか?