Je suis en train de comprendre comment mapper une structure récursive contenant les dictionnaires et les listes, jusqu'à présent, j'ai ceci:Comment mapper une structure récursive?
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")))
Sortie:
[[[]], [[[[[]]]]]]
{}
Comme vous pouvez le voir, problème avec l'exemple ci-dessus est que rec_map ne renvoie pas une structure correctement mappée, ce que j'essaie d'obtenir est soit la même structure mappée correctement ou un nouveau mappé cloné, par exemple, quelque chose comme ceci:
a = ["0", ["1", "2", ["3", "4"]], [[[[["5"]]]]]]
rec_map(a, lambda x: x + "_tweaked")
devrait transformer a
en:
["0_tweaked", ["1_tweaked", "2_tweaked", ["3_tweaked", "4_tweaked"]], [[[[["5_tweaked"]]]]]]
et:
b = {
'a': ["0", "1"],
'b': [[[[[["2"]]]]]],
'c': {
'd': [{
'e': [[[[[[["3"]]]]]]]
}]
}
}
print(dict(rec_map(b, lambda x: x + "_tweaked")))
dans:
b = {
'a': ["0_tweaked", "1_tweaked"],
'b': [[[[[["2_tweaked"]]]]]],
'c': {
'd': [{
'e': [[[[[[["3_tweaked"]]]]]]]
}]
}
}
@BPL c'est le même principe, vous devez le matérialiser dans un dictionnaire ou une liste en fonction du conteneur que vous itérez –
@BPL mis à jour avec une autre approche –
Merci beaucoup, votre solution est vraiment propre sans utiliser de générateurs, je Je vous en donnerais un autre ... mais vous savez, je vous ai déjà donné 1;) – BPL