2016-09-07 2 views
0

リストの構造を一致させますか?たとえば

A=[1,[2,3],[4,[5,6]],7] 
B=[2,3,4,5,6,7,8] 

どのように私は[2,[3,4],[5,[6,7]],8]を得ることができますか?

+3

入力から出力への望ましい変換に関する詳細を提供してください。あなたの例の出力は入力とどのように関連していますか? –

+0

@CraigBurgler私はOPが他と同じサブリストをコピーすることを意味していると思いますので、リストの同じ構造体(ure)を保持してください – Li357

+0

return [2、[3,4]、[5、[6,7 ]]、8] – marcadian

答えて

9

あなたはかなり単純な再帰関数で使用することができます:ここで

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)が返された場合はリストが返されます。

+0

Pythonに慣れていない人のための正確なアルゴリズムを教えてください。あなたがそれをどのように考えているのか興味がありますが、残念ながら私はPythonでプログラムしません。 –

+0

@Bi Rico:Hrmph。私は基本的に同じ機能を書いていましたが、現在のエントリのタイプをチェックして、いつ底を打つべきかを決めました。あなたのものは短くても道徳的ではありません。あなたは本当に再帰の一番下を検出し、あるレベルをもう一度繰り返し、例外をキャッチしたいのですか?これは哲学だと思います! –

+0

例外をキャッチする(ダックタイピング)は、明示的な型チェックよりもはるかにPythonicです –

関連する問題