我試圖找出如何映射同時包含字典和列表遞歸結構,到目前爲止,我得到這個:如何映射遞歸結構?
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