Сравнение структуры списков
Стоит задача сравнить структуру списка, то есть расположения в нём списков, например,
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