A=[1,[2,3],[4,[5,6]],7]
B=[2,3,4,5,6,7,8]
どのように私は[2,[3,4],[5,[6,7]],8]
を得ることができますか?
A=[1,[2,3],[4,[5,6]],7]
B=[2,3,4,5,6,7,8]
どのように私は[2,[3,4],[5,[6,7]],8]
を得ることができますか?
あなたはかなり単純な再帰関数で使用することができます:ここで
def match(struct, source):
try:
return [match(i, source) for i in struct]
except TypeError:
return next(source)
A=[1,[2,3],[4,[5,6]],7]
B=[2,3,4,5,6,7,8]
match(A, iter(B))
# [2, [3, 4], [5, [6, 7]], 8]
を何人かの人々が理解するために少し楽かもしれない機能のバージョンです:
def match(struct, source, index=0):
if isinstance(struct, list):
r = []
for item in struct:
next, index = match(item, source, index)
r.append(next)
return r, index
else:
return source[index], index + 1
A=[1,[2,3],[4,[5,6]],7]
B=[2,3,4,5,6,7,8]
match(A, B)
基本的な考え方をされて最初に入力構造の深度をループし、それに応じてソースから値を消費します。数字を打つと、ソースから1つの数字だけを取り出すことができます。リストをヒットしたら、このアルゴリズムをそのリストに適用する必要があります。途中で、消費したアイテムの数を把握する必要があります。
アルゴリズムの最初のバージョンがこれをすべて行いますが、少し異なります。 iter(B)
は、iがnext(source)
にコールされたときに、bからのいくつのアイテムが消費され、次のアイテムが提供されたかを追跡するイテレータを作成し、インデックスを明示的に追跡する必要はありません。私がstruct
をループできるかどうかを調べるためにtry/exceptをチェックします。できる場合は、expectブロックが実行されず、next(source)
が返された場合はリストが返されます。
Pythonに慣れていない人のための正確なアルゴリズムを教えてください。あなたがそれをどのように考えているのか興味がありますが、残念ながら私はPythonでプログラムしません。 –
@Bi Rico:Hrmph。私は基本的に同じ機能を書いていましたが、現在のエントリのタイプをチェックして、いつ底を打つべきかを決めました。あなたのものは短くても道徳的ではありません。あなたは本当に再帰の一番下を検出し、あるレベルをもう一度繰り返し、例外をキャッチしたいのですか?これは哲学だと思います! –
例外をキャッチする(ダックタイピング)は、明示的な型チェックよりもはるかにPythonicです –
入力から出力への望ましい変換に関する詳細を提供してください。あなたの例の出力は入力とどのように関連していますか? –
@CraigBurgler私はOPが他と同じサブリストをコピーすることを意味していると思いますので、リストの同じ構造体(ure)を保持してください – Li357
return [2、[3,4]、[5、[6,7 ]]、8] – marcadian