5

2つの入力を受け取るプロシージャsame_structureを定義します。Trueリストが同じ構造の場合は出力され 、それ以外の場合は出力されFalse ます。次の場合、2つの値pとqは同じ構造になります。

Neither p or q is a list.

Both p and q are lists, they have the same number of elements, and each
element of p has the same structure as the corresponding element of q.

編集:画像を明確にするために、以下は期待される出力です

same_structure([1, 0, 1], [2, 1, 2])
    ---> True
same_structure([1, [0], 1], [2, 5, 3])
    ---> False
same_structure([1, [2, [3, [4, 5]]]], ['a', ['b', ['c', ['d', 'e']]]])
    ---> True
same_structure([1, [2, [3, [4, 5]]]], ['a', ['b', ['c', ['de']]]])
    ---> False 

Pythonでこの問題を解決するには再帰が最適だと思いました。次のコードを考え出しましたが、機能しません。

def is_list(p):
    return isinstance(p, list)

 def same_structure(a,b):
    if not is_list(a) and not is_list(b):
        return True
    elif is_list(a) and is_list(b):
        if len(a) == len(b):
            same_structure(a[1:],b[1:])
    else:
        return False
4

5 に答える 5

6

の代わりにsame_structure(a[1:],b[1:])、aとbのアイテムペアを1つずつチェックする必要があります

def is_list(p):
    return isinstance(p, list)

def same_structure(a, b):
    if not is_list(a) and not is_list(b):
        return True
    elif (is_list(a) and is_list(b)) and (len(a) == len(b)):
        return all(map(same_structure, a, b)) # Here
    return False
于 2012-04-09T15:43:03.050 に答える
5

1つのケースが欠落していて、2番目のケースに戻るのを忘れています。リストの長さを明示的に比較する必要はないことに注意してください。最初のケースでこれが処理されます。一方のリストが空で、もう一方が空でない場合は、一方のリストの要素が他方よりも少ないためです。

def same_structure(a, b):
    if a == [] or b == []:  # one of the lists is empty
        return a == b       # are both of the lists empty?
    elif is_list(a[0]) != is_list(b[0]):
        return False        # one of the elements is a list and the other is not
    elif not is_list(a[0]): # neither element is a list
        return same_structure(a[1:], b[1:])
    else:                   # both elements are lists
        return same_structure(a[0], b[0]) and same_structure(a[1:], b[1:])
于 2012-04-09T15:24:12.077 に答える
3

再帰良い考えですが、あなたが提案した方法ではありません。まず最初に(これはタイプミスにすぎない可能性があります)、実際にはここでは何も返しません。

if len(a) == len(b):
    same_structure(a[1:],b[1:])

次に、各サブリストではなく、各要素を再帰的に処理する必要があります。すなわち:

if len(a) == len(b):
    for i in range(len(a)):
        if not same_structure(a[i], b[i]):
            return False
    return True
else:
    return False

お役に立てれば。

于 2012-04-09T15:22:53.590 に答える
1

仕様では、入力は2つのリストであると規定されているため、関数内のリストをさらにチェックせずに繰り返すことができ、サブリストに遭遇した場合にのみ再帰呼び出しを実行できます。

def same_structure(a, b):
    if len(a) != len(b):
        return False
    return all(is_list(x) and is_list(y) and same_structure(x, y) or
               not is_list(x) and not is_list(y)
               for x, y in zip(a, b))
于 2012-04-09T15:46:09.120 に答える
0

この方法も試して、両方のリストのタイプと両方のリストの長さを確認し、両方のリストのサブリストに対してこれを再帰的に実行することもできます。

def same_structure(a,b):
    return isinstance(a, list) and isinstance(b, list) and len(a) == len(b)  
    and all(same_structure_as(c, d) for c, d in zip(a, b) if isinstance(c, list))
于 2017-02-13T14:56:38.737 に答える