2016-10-29 5 views
3

私は再帰を学習していますが、なぜこれが機能しないのか分かりません。それは何をすべきPython - 再帰:intを複写する、リスト内のintを複製する、ネストされたリスト内にintを複写する

>>> copy(1) 
[1, 1] 
>>> copy([1, 2]) 
[1, 1, 2, 2] 
>>> copy([1, [2, 3]]) 
[1, 1, [2, 2, 3, 3]] 

だから、基本的にはコードだけで各整数を複製する必要があります。注:リスト内の位置とフォーマット(ネストされたリストの場合)は変更されません。このコードはすべて、リスト内の各intの横に重複するintを挿入します。

コード:

def copy(nested_list): 
    new_list = [] 

    #if list is empty 
    if isinstance(nested_list, list) and len(nested_list) == 0: 
     return new_list 

    # if it's only an int 
    elif isinstance(nested_list, int): 
     new_list.append(nested_list) 
     new_list.append(nested_list) 

    else: 
     # if list is a list 
     if isinstance(nested_list, list): 
      for num in range(len(nested_list)): 
       if isinstance(nested_list[num], int): 
        new_list.append(nested_list[num]) 
        new_list.append(nested_list[num]) 
       elif isinstance(nested_list[num], list): 
        copy(nested_list[num]) 
       else: 
        pass 

    return new_list 

それは最後の1を除いて、例のほとんどのために動作します。あなたのcopy関数は再帰的ですが、あなたは完全にcopyに再帰呼び出しの結果を無視

Expected: 
    [1, 1, [2, 2, 3, 3]] 
Got: 
    [1, 1] 

答えて

4

は、このいずれかをチェックしてください!

def copy(nested_list): 
    new_list = [] 

    #if list is empty 
    if isinstance(nested_list, list) and len(nested_list) == 0: 
     return new_list 

    # if it's only an int 
    elif isinstance(nested_list, int): 
      new_list.append(nested_list) 
      new_list.append(nested_list) 

    else: 
     # if list is a list 
     if isinstance(nested_list, list): 
      for num in range(len(nested_list)): 
       if isinstance(nested_list[num], int): 
        new_list.append(nested_list[num]) 
        new_list.append(nested_list[num]) 
       elif isinstance(nested_list[num], list): 
        tempList = copy(nested_list[num]) 
        new_list.append(tempList) 
       else: 
        pass 

    return new_list 

print(copy([1, [2, 3]])) 
+0

ahhはい、私は再帰呼び出しの結果を処理する必要があります。良いキャッチ、ありがとう! – Theo

+0

OPの間違いとあなたのコードがなぜ機能するのか、あなたの答えに言及してください。 –

+0

@ rakeb.mazharul私はこれを私の心に残していきます。私はあなたの提案に感謝します。 –

1

elif isinstance(nested_list[num], list): 
    copy(nested_list[num]) 
    ^^^^^^^^^^^^^^^^^^^^^^ 

おそらく欲しい、それが最後の例のために戻って与え続け

copyへの呼び出しで返されたアイテムをnew_listの末尾に追加します。

new_list.append(copy(nested_list[num])) 

また、それを少し簡略化することができます。

def copy(nested_list): 
    if isinstance(nested_list, int): 
     return copy([nested_list]) 

    result = [] 

    for elem in nested_list: 
     if isinstance(elem, int): 
      result.append(elem) 
      result.append(elem) 
     else: 
      result.append(copy(elem)) 

    return result 
+0

しかし、私はあなたが.appendを入れて拡張しないことを意味していると思うが、[1、1、2、2、3、3]のようなものを返すだろうが、[1、1、 2,3,3]] – Theo

+0

@テオ:うん、そうだよ。 – Blender

1

これは別の実装です。

def copy(items): 
    if isinstance(items, int): 
     return [items, items] 

    result = [] 
    for element in items: 
     if isinstance(element, int): 
      result.extend(copy(element)) 
     else: 
      result.append(copy(element)) 
    return result 
0

再帰へのトリックは、最も基本的な事件を解決し、(今)小さな問題を解決するために自分自身を呼び出すことです:

def repeat_int(seq_or_int, nested=False): 
    try: 
     first, *rest = seq_or_int 
    except TypeError: # got int 
     return [seq_or_int] * 2 # repeat int 
    except ValueError: # empty 
     result = [] 
    else: 
     result = repeat_int(first, nested=True) + repeat_int(rest) 
    return [result] if nested else result # nest in a list if necessary 

例:

>>> repeat_int(1) 
[1, 1] 
>>> repeat_int([1, 2]) 
[1, 1, 2, 2] 
>>> repeat_int([1, [2, 3]]) 
[1, 1, [2, 2, 3, 3]] 

基本的な2がありますここのケース:

  • 入力がiterではありません(intなどのスカラー) - 繰り返し入力をリストに戻す
  • 入力が空です - 空のリストを返します。入力コレクションの最初の項目をオフ

The Python 3 iterable unpacking syntaxチョップ:

first, *rest = seq_or_int 

コレクションの残りの結果を取得するには、再帰呼び出しは(今)小さなリストで構成されていますrepeat_int(rest)

残っているのは、入力と同じ最初のアイテムを扱うことだけです。これもコレクションである可能性があります。構造体を保持するために、nestedインジケータが渡され、設定されている場合、結果リストは別のリストにラップされます。

関連する問題