Map/Reduce est une façon courante pour ce type de problème.
Exemple pour un dictionnaire imbriqué à deux niveaux:
>>> nested_dicts = {'one': {'one_one': 'one_one_value', 'one_two': 'one_two_value'}, 'two': {'two_one': 'two_one_value', 'two_two': 'two_two_value'}}
>>> from functools import reduce
>>> reduce(lambda x, y: x + list(y.values()), nested_dicts.values(), [])
['one_two_value', 'one_one_value', 'two_two_value', 'two_one_value']
Vous pouvez, bien sûr, l'utilisation récursion avec reduce
, ainsi:
>>> nested_dicts = {'d1': 'd1 val', 'd2': {'d2_1': {'d2_1_1': 'd2_1_1 val', 'd2_1_2': 'd2_1_2 val'}, 'd2_2': {'d2_2_1': 'd2_2_1 val'}}}
>>> def to_list(value):
... return [value] if isinstance(value, str) else reduce(lambda x,y: x+to_list(y), value.values(), [])
...
>>> to_list('test')
['test']
>>> reduce(lambda x, y: x+to_list(y), nested_dicts.values(), [])
['d2_2_1 val', 'd2_1_1 val', 'd2_1_2 val', 'd1 val']
si c'est des dictionnaires imbriqués infinis? Je ne sais pas combien de niveaux. – TIMEX
Ma réponse mise à jour prend en charge les dictionnaires imbriqués et récursifs avec détection de boucle pour empêcher la récursion infinie. –
L'imbrication arbitraire de dicts est probablement indicative d'une conception qui pourrait être améliorée. –