Я пытаюсь решить практическое упражнение, в котором мне нужно рекурсивно иммутировать типы данных, но у меня возникают проблемы с рекурсивным регистром:
Функция возвращает неизменную эквивалентную структуру данных (такую, котораяможет быть использован для значений в наборе или ключи в DICT).Типы int, str и frozenset уже неизменны.Конвертировать набор в морозилку;преобразовать все значения в кортеже в их неизменные эквиваленты в том же порядке);преобразовать список в кортеж (с неизменными эквивалентами его значений в том же порядке);преобразовать dict в кортеж из 2-х кортежей
Я попал в базовый вариант, но не намного ...
def immutify(a : 'an int, str, list, tuple, set, or dict') -> 'an int, str, tuple, or forzenset':
if (isinstance(a, int)):
return a
if (isinstance(a, str)):
return a
if (isinstance(a, tuple)):
# immutify each element in it?
if (isinstance(a, frozenset)):
# immutify each element in it?
if (isinstance(a, set)):
# return an immutified frozenset of a?
if (isinstance(a, list)):
# return an immutified tuple of a?
if (isinstance(a, dict)):
#return an immutified tuple of a?
Ожидаемый результат:
immutify(1) # -->1
immutify('a') # -->'a'
immutify( (1, 2, 3)) # -->(1, 2, 3)
immutify( frozenset([1, 2, 3])) # -->frozenset({1, 2, 3})
immutify( [1, 2, 3, 4, 5, 6]) # -->(1, 2, 3, 4, 5, 6)
immutify( [1, 2, [3, [4], 5], 6])# -->(1, 2, (3, (4,), 5), 6)
immutify( [1, 2, (3, [4], 5), 6]) # -->(1, 2, (3, (4,), 5), 6)
immutify( [{1,2}, {3,frozenset([4,5])}, {6,7}]) #-->(frozenset({1, 2}), frozenset({3, frozenset({4, 5})}), frozenset({6, 7}))
immutify( [{1,2}, {3,frozenset([4,5])}, [{5,6}]]) #-->(frozenset({1, 2}), frozenset({3, frozenset({4, 5})}), (frozenset({5, 6}),))
immutify( {'b' : [1,2], 'a' : {'ab': {1,2}, 'aa' : (1,2)}}) #-->(('a', (('aa', (1, 2)), ('ab', frozenset({1, 2})))), ('b', (1, 2)))
РЕДАКТИРОВАТЬ: Я почти получил там:
def immutify(a : 'an int, str, list, tuple, set, or dict') -> 'an int, str, tuple, or forzenset':
if (isinstance(a, int)):
return a
if (isinstance(a, str)):
return a
if (isinstance(a, tuple)):
out = []
for elem in a:
new = immutify(elem)
out.append(new)
return tuple(out)
if (isinstance(a, frozenset)):
out = []
for elem in a:
new = immutify(elem)
out.append(new)
return frozenset(out)
if (isinstance(a, set)):
out = []
for elem in a:
new = immutify(elem)
out.append(new)
return tuple(out)
if (isinstance(a, list)):
out = []
for elem in a:
new = immutify(elem)
out.append(new)
return tuple(out)
if (isinstance(a, dict)):
out = []
for elem in a:
new = immutify(elem)
out.append(new)
return tuple(out)