Сравнение структуры списков

Стоит задача сравнить структуру списка, то есть расположения в нём списков, например,

a=[1,[1,1]]   
b=[2,[2,2]] 

должно вернуть True, пока

a=[[1,1],1]  
b=[2,[2,2]]

должно вернуть False.

Была идея заменять все значения(за исключения списков) списками, но реализация не удалась, так как массивы могут быть многомерными.

Рад любым предложениям.


Ответы (3 шт):

Автор решения: Roman-Stop RU aggression in UA

Что-то в таком духе (с улучшениями от @CrazyElf):

def cmp_struct(lhs, rhs):
    if type(lhs) != list != type(rhs):
        return True
    elif type(lhs) == list == type(rhs) and len(lhs) == len(rhs):
        return all(cmp_struct(l, r) for l, r in zip(lhs, rhs))
    else:
        return False

print(cmp_struct([], []))                    # True
print(cmp_struct([1], []))                   # False
print(cmp_struct([1], [2]))                  # True
print(cmp_struct([1, []], [2]))              # False
print(cmp_struct([1, [2, 4]], [5, [1, 2]]))  # True
→ Ссылка
Автор решения: AniArim

Или в таком:

def chek(l1: list, l2: list):
    for idx, element in enumerate(l1):
        if type(element) != type(l2[idx]):
            return False
    return True
print(chek([1, [1, 1]], [[2, 2]]))
→ Ссылка
Автор решения: SergFSM

можно попробовать что-то наподобие этого, вроде работает как надо:

a=[1,[1,1],[22,3]] 
b=[2,[2,2],[3,44]]
c=[3,[1,1],[2,3,4]]

f = lambda x: str(x).translate(str.maketrans('','','0123456789'))

f(a)==f(b)  # True
f(a)==f(c)  # False

PS. здесь пример с целыми числами, но для строковых значений подход аналогичный.

UPD

этот вариант работает со всеми символами:

a=[1,[1,1],[22,'abc№123']] 
b=[2,[2,2],['3_2.5%',44]]

from re import sub

f = lambda x: sub(r'[^\[\],]','',str(x))

f(a)==f(b)  # True
→ Ссылка