python - 如何在一种方法中递归地使参数传递的数据类型不可变?
问题描述
我正在尝试解决一个需要递归地使数据类型不变的练习练习,但是递归案例存在问题:
该函数返回一个不可变的等效数据结构(可用于集合中的值或字典中的键)。int、str 和frozenset 类型已经是不可变的。将集合转换为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)
解决方案
我知道了。
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)
return a
if (isinstance(a, set)):
out = []
for elem in a:
new = immutify(elem)
out.append(new)
return frozenset(out)
if (isinstance(a, list)):
out = []
for elem in a:
new = immutify(elem)
out.append(new)
return tuple(out)
if (isinstance(a, dict)):
tup = []
pair = []
for elem in a:
new1 = immutify(elem)
new2 = immutify(a[elem])
pair.append(new1)
pair.append(new2)
tup.append(tuple(pair))
pair = []
return tuple(tup)
推荐阅读
- javascript - Chrome 下载 csv 不适用于编码 uri 组件
- android - 在drawable中为圆制作小半径
- lua - 在 Roblox 中,被破坏的部分不会在全局范围内被破坏
- c++ - 如何在避免 char 行为的同时将 uint8_t 与 I/O 流一起使用?
- html - 从 font-awesome v4 到 v5
- django - 使用 Django 模板发送电子邮件
- python - 为什么我的 Robotframework 总是在 Firefox 上运行
- c# - 当插入了具有特定列值的新行时,使控制台应用程序在 Windows 服务的循环中运行
- python - 高分辨率图像使用数组删除低分辨率栅格中的属性
- html - 模态窗口的滚动条:为什么启用了不可见的allthaugh?