Построение функции из списков в списках в Python - PullRequest
0 голосов
/ 21 декабря 2011

Я нахожусь в тупике о том, как создать функцию, которая работает со списками внутри списков изнутри (я думаю, это то, как вы могли бы плохо описать это).

Я пытаюсь динамически перевернуть список, как

res = SomeDjangoQuerySet
x = ['neighborhood', ['city', ['metro', 'metro']]]

в:

getattr(getattr(getattr(getattr(res, 'neighborhood'), 'city'), 'metro'), 'metro')

AKA:

getattr(getattr(getattr(getattr(res, x[0]), x[1][0]), x[1][1][0]), x[1][1][1])

По сути, первое значение всегда будет строкой, второе значение будет либо строкойили список.Каждый список будет следовать этому шаблону (строка, строка ИЛИ список).Глубина списков внутри списков не определена.Первым внутренним значением getattr () будет внешняя переменная (в данном случае 'res').Любой совет?

Ответы [ 3 ]

3 голосов
/ 21 декабря 2011

Похоже, рекурсия и итерация могут быть полезны.Делает ли это то, что вы хотите?

def flatten(data):
    res = []
    if hasattr(data, '__iter__'):
        for el in data:
            res.extend(flatten(el))
    else:
        res.append(data)
    return res


reduce(getattr, flatten(x), res)
1 голос
/ 22 декабря 2011

Я потратил некоторое время на изучение рекурсии и обнаружил, что это самое простое решение (хотя, спасибо Дэвиду Цвикеру, который также предоставил работающее решение).

def recursion(a, b):
    if type(b) is list:
        return recursion(getattr(a, b[0]), b[1])
    else:
        return getattr(a, b)

recursion(res, x)
1 голос
/ 21 декабря 2011
def nestattr(x, y):
    if isinstance(y, str):
        return getattr(x, y)
    elif isinstance(y, list):
        return nestattr(getattr(x, y[0]), y[1])

nestattr(res, x)

Итак, вы начинаете с первой строки в списке, и у вас есть getattr из (1) запроса с (2) этой строкой. Затем вы выполняете рекурсию, используя оставшуюся часть этого списка, и, если это строка, вы просто делаете getattr для (1) результата предыдущего getattr с (2) этой строкой. В противном случае, если это все еще список, вы повторите. Я думаю, это то, что вы ищете? Поправь меня, если я ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...