我试图找出如何映射同时包含字典和列表递归结构,到目前为止,我得到这个:如何映射递归结构?
import collections
def rec_walk(l):
for v in l:
if isinstance(v, list):
yield from rec_walk(v)
else:
yield v
def rec_map(l, f):
for v in l:
if isinstance(v, collections.Iterable):
if isinstance(v, list):
yield list(rec_map(v, f))
elif isinstance(v, dict):
yield dict(rec_map(v, f))
else:
yield f(v)
a = ["0", ["1", "2", ["3", "4"]], [[[[["5"]]]]]]
print(list(rec_map(a, lambda x: x + "_tweaked")))
b = {
'a': ["0", "1"],
'b': [[[[[["2"]]]]]],
'c': {
'd': [{
'e': [[[[[[["3"]]]]]]]
}]
}
}
print(dict(rec_map(b, lambda x: x + "_tweaked")))
输出:
[[[]], [[[[[]]]]]]
{}
正如你所看到的,上面的例子的问题是,rec_map没有返回一个正确映射的结构,我试图得到的结果要么是相同的结构映射正确,要么是一个新的克隆映射的结构,例如,像这样的:
a = ["0", ["1", "2", ["3", "4"]], [[[[["5"]]]]]]
rec_map(a, lambda x: x + "_tweaked")
要转变成a
:
["0_tweaked", ["1_tweaked", "2_tweaked", ["3_tweaked", "4_tweaked"]], [[[[["5_tweaked"]]]]]]
和:
b = {
'a': ["0", "1"],
'b': [[[[[["2"]]]]]],
'c': {
'd': [{
'e': [[[[[[["3"]]]]]]]
}]
}
}
print(dict(rec_map(b, lambda x: x + "_tweaked")))
到:
b = {
'a': ["0_tweaked", "1_tweaked"],
'b': [[[[[["2_tweaked"]]]]]],
'c': {
'd': [{
'e': [[[[[[["3_tweaked"]]]]]]]
}]
}
}
@BPL它是一样的原则,你需要实现它到一个字典或列表取决于你正在迭代的容器 –
@BPL更新与另一种方法 –
感谢一堆,你的解决方案是一个非常干净的没有使用发电机,我'给你另一个喜欢......但你知道,我已经给你1;) – BPL