Как элегантно перебирать список или словарь - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть переменная (объект из базы данных). В некоторых случаях эта переменная может иметь тип list , а в некоторых случаях dictionary .

Стандарт для цикла, если переменная список :

for value in object_values:
    self.do_something(value)

Стандарт для цикла, если переменная словарь :

for key, value in object_values.items():
    self.do_something(value)

Я могу использовать instanceof() две проверки типа, но тогда мне все еще нужны две функции или if с двумя for циклами. Теперь у меня есть условие if, которое вызывает одну из двух функций, одну для итерации в виде списка (например, iterate_list()) и вторую для итерации в виде словаря (например, iterate_dict()).

Есть ли лучший вариант, как элегантно и более питонически решить проблему, которую я не знаю, будет ли переменная списком или словарем?

1 Ответ

0 голосов
/ 26 апреля 2018

в вашем случае, поскольку данные являются либо элементами, либо значениями словаря, вы можете использовать троицу для получения values() или просто итерацию в зависимости от типа:

def iterate(self,object_values):
    for value in object_values.values() if isinstance(object_values,dict) else object_values:
        self.do_something(value)

Если вы передаете tuple, генератор или другую итерацию, она возвращается к «стандартной» итерации. Если вы передаете словарь (или OrderedDict или другой), он перебирает значения.

В отношении производительности троичное выражение вычисляется только один раз в начале итерации, так что все в порядке.

Бит isinstance можно даже заменить на if hasattr(object_values,"values"), так что даже недиктивные объекты с элементом values будут совпадать.

(Обратите внимание, что вы должны знать о принципе "наименьшего числа жертв". Некоторые люди могут ожидать итерацию по ключам словаря при вызове метода)

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