Python: извлечение списка из массива словарей с массивами в них - PullRequest
0 голосов
/ 02 ноября 2010

Боюсь, этот вопрос немного запутанный. Я пишу функциональный тест для API, который, когда я запрашиваю его, возвращает JSON со встроенными списками. Вот значительный фрагмент того, как это выглядит (со всеми данными, анонимными для этого вопроса):

[{u'account': {u'account_name': u'Autotest Account',
               u'account_uid': u'000000000'},
  u'address': {u'city': u'AutoTest City',
               u'country': u'United States',
               u'postal_code': u'10019',
               u'province': None,
               u'state': u'IL',
               u'street': [u'12 Auto Road']},
  u'children': [{u'institution_name': u'Autotest Bottom Institution 1',
                 u'institution_type': 1,
                 u'institution_uid': u'111111111'},
                {u'institution_name': u'Autotest Bottom Institution 2',
                 u'institution_type': 1,
                 u'institution_uid': u'222222222'},
                {u'institution_name': u'Autotest Bottom Institution 3',
                 u'institution_type': 1,
                 u'institution_uid': u'333333333'},
                {u'institution_name': u'Autotest Bottom Institution 4',
                 u'institution_type': 1,
                 u'institution_uid': u'444444444'},
                {u'institution_name': u'Autotest Bottom Institution 5',
                 u'institution_type': 1,
                 u'institution_uid': u'555555555'},
                {u'institution_name': u'Autotest Bottom Institution 6',
                 u'institution_type': 1,
                 u'institution_uid': u'666666666'},
                {u'institution_name': u'Autotest Bottom Institution 7',
                 u'institution_type': 1,
                 u'institution_uid': u'777777777'},
                {u'institution_name': u'Autotest Bottom Institution 8',
                 u'institution_type': 1,
                 u'institution_uid': u'888888888'}],
  u'institution_name': u'Autotest Middle Institution 1',
  u'institution_type': 2,
  u'institution_uid': u'000000001',
  u'parent': {u'institution_name': u'Autotest Top Institution',
              u'institution_type': 3,
              u'institution_uid': u'000000099'},
  u'school_year': 2011},
 {u'account': {u'account_name': u'Autotest Account',
               u'account_uid': u'000000000'},
  u'address': {u'city': u'Bacon City',
               u'country': u'United States',
               u'postal_code': u'10018',
               u'province': None,
               u'state': u'IL',
               u'street': [u'15 Wonder Road']},
  u'children': [],
  u'institution_name': u'Autotest Bottom Institution 1',
  u'institution_type': 1,
  u'institution_uid': u'111111111',
  u'parent': {u'institution_name': u'Autotest Middle Institution 1',
              u'institution_type': 2,
              u'institution_uid': u'000000001'},
  u'school_year': 2011}]

То, что я пытаюсь выполнить, - это извлечь все имена "Bottom Institution" из JSON и поместить их в список, который я затем смогу сравнить со списком, который уже есть в моих данных тестовых приборов. Это должно выглядеть примерно так:

<code>['Autotest Bottom Institution 1','Autotest Bottom Institution 2','Autotest Bottom Institution 3','Autotest Bottom Institution 4','Autotest Bottom Institution 5','Autotest Bottom Institution 6','Autotest Bottom Institution 7','Autotest Bottom Institution 8']

Я могу извлечь их по одному или итерацией, после загрузки данных в "inst_array", например так:

>>> print inst_array[0]['children'][0]['institution_name']
Autotest Bottom Institution 1
>>> print inst_array[0]['children'][1]['institution_name']
Autotest Bottom Institution 2
>>> print inst_array[0]['children'][2]['institution_name']
Autotest Bottom Institution 3

Но вот кикер: я хочу быть в состоянии сделать это без итерации (или с как можно меньшим количеством итераций), и из-за бесчисленного количества уровней вложения, это меня озадачило.

Есть мысли?

Ответы [ 5 ]

5 голосов
/ 02 ноября 2010

Не должно ли что-то подобное работать?

names = [child['institution_name'] for child in inst_array[0]['children']]
1 голос
/ 02 ноября 2010

Я думаю, что понимание списка все еще является формой итерации, но, по крайней мере, кратким:

your_list = [elem['institution_name'] for elem in inst_array[0]['children']]
0 голосов
/ 02 ноября 2010

Что-то вроде:

[ x['institution_name'] for x in inst_array[0]['children'] ]
0 голосов
/ 02 ноября 2010

Я не уверен, что вы имеете в виду именно «без итерации», но вот что-то с подразумеваемой итерацией, которая может работать:

 [x['institution_name'] for x in inst_array[0]['children'] if x['institution_name']]
0 голосов
/ 02 ноября 2010

Не уверен, что вы подразумеваете под «без итераций».Все, что вы здесь делаете, должно включать в себя итерацию списков по определению.

В любом случае, вот попытка:

institutions = set()
for account in data:
    for child in account['children']:
        institutions.add(child['institution_name'])    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...