明確化:彼らは考慮にネストしたリストを取ることはありませんので、Pythonは可変引数連結演算子を実装
私はちょうど下の私の定義とコードを実現は、間違っているかもしれません。 concatenate
の最終的な結果は、リストではないオブジェクトか、リストではない1つ以上のオブジェクトのリスト(ネストされたリストはありません)のいずれかになりたいと本当に思います。そして、空のリストはオブジェクトEmptyになるはずです。
しかし、ユーザーが、私はdenestedするためにそれらを必要とするような場合には、ネストされたリストからなる入力を提供することが可能です。これについて明確でないことに対する謝罪。
私は特定の型のオブジェクトを持っています(これも値としてEmptyを持つことができます)。そして、次の公理を満たすこれらのオブジェクトに対してバイナリ連結演算子を持っています(ここで[A、B]はAとB ):
concatenate2(Empty, A) = concatenate2(A, Empty) = A
concatenate2(A, [B, C]) = concatenate2([A, B], C) = [A, B, C]
concatenate2(A, B) = [A, B] (if A, B do not match any of the previous cases).
今、私はまた、任意に、多くの用語の連結を持つようにしたい:私はリストのコピー操作の数を最小限に抑える方法で、これらの演算子を実装したいと思います
concatenate([]) = Empty
concatenate([A]) = A
concatenate([A, B]) = concatenate2(A, B)
concatenate([A, B, ...]) = concatenate([concatenate2(A, B), ...])
が、私はこのベストを行う方法がわかりませんPythonで。
def concatenate2(A, B):
if A == Empty:
return B
if B == Empty:
return A
if type(A) == list:
return concatenate(A + [B])
if type(B) == list:
return concatenate([A] + B)
return [A, B]
def concatenate(terms):
if terms == []:
return Empty
if len(terms) == 1:
return terms[0]
if len(terms) == 2:
return concatenate2(terms[0], terms[1])
return concatenate(concatenate2(terms[0], terms[1]) + terms[2:])
これはかなりいいと明確に見えますが、私はそれがパフォーマンスとメモリ使用量の観点に立ってどれだけ知っていない:
私の現在の考えは、このような何かをすることでした。私はそれが各[...] + [...]操作の間にあまりにも多くのリストコピーを引き起こすかもしれないと心配です。
これらの操作を実装するより良い方法はありますか?
最終的には、実際にはconcatenate
操作のみが必要であることに注意してください。 concatenate2
演算子を使用して素敵な再帰的な定義を与えましたが、誰かがそれを使用しないより効率的なソリューションを提案できるなら、私もそれを受け入れます。
'concatenate2([A、B]、[C、D])'は何をするべきですか? – user2357112
[A、B、C、D]を返すはずです(これらはリストではないと仮定します)。 –
ネストされたリストも同様に平坦化したいですか? – schwobaseggl