Python: объединить "если 'x' в dict" и "для я в dict ['x']" - PullRequest
6 голосов
/ 16 декабря 2010

Действительно два вопроса: если у меня есть словарь (который изначально был получен при разборе json-сообщения), в котором есть необязательный массив:

dict_with = {'name':'bob','city':'san francisco','kids': {'name': 'alice'} }
dict_without = {'name':'bob','city':'san francisco' }

Я бы обычно имел такой код:

if 'kids' in dict:
   for k in dict['kids']:
      #do stuff

Мой первый вопрос: есть ли какой-нибудь способ на Python объединить защиту if и цикл for?

Второй вопрос - моя интуиция говорит мне, что лучший дизайн для исходного сообщения json - всегда указывать элемент kids, просто с пустым словарем:

dict_better = {'name':'bob','city':'san francisco','kids': {} }

Я не могу найти методологию проектирования, которая бы подтверждала это. Сообщение json - это сообщение о состоянии от веб-службы, которая поддерживает представления json и xml. Так как они начали с xml, они сделали так, чтобы элемент "kids" был необязательным, что заставляет приведенную выше конструкцию проверять, существует ли элемент перед итерацией по массиву. Я хотел бы знать, лучше ли по дизайну говорить, что элемент является обязательным (просто с пустым массивом, если нет элементов).

Ответы [ 3 ]

10 голосов
/ 16 декабря 2010
for x in d.get("kids", ()):
    print "kid:", x
7 голосов
/ 16 декабря 2010

Пустая последовательность не приводит к итерации.

for k in D.get('kids', ()):
4 голосов
/ 16 декабря 2010

[x for x in dict_with.get('kids')], Вы можете использовать это filter, map - a functional programming tools с пониманием списка.

  • понимание списка более лаконично.
  • выполняется намного быстрее, чем руководство для операторов цикла.
  • Чтобы избежать key-error, используйте dict_with.get('xyz',[]) возвращает пустой список.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...