【问题标题】:Python: extracting a list from an array of dictionaries with arrays in themPython:从包含数组的字典数组中提取列表
【发布时间】:2011-05-04 01:52:38
【问题描述】:

恐怕这个问题有点令人费解。我正在对 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}]

我想要完成的是从 JSON 中提取所有“底层机构”名称,并将它们放入一个列表中,然后我可以将其与我的测试夹具数据中已经存在的列表进行比较。它应该看起来像这样:

['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

但关键在于:我希望能够在不进行迭代的情况下(或者尽可能少地进行迭代)做到这一点,并且由于其中嵌套了无数层,这让我感到困惑。

有什么想法吗?

【问题讨论】:

    标签: python arrays dictionary nested


    【解决方案1】:

    不应该这样工作吗?

    names = [child['institution_name'] for child in inst_array[0]['children']]
    

    【讨论】:

    • 你先生,真是个天才。是的,这正是我想要的。出于某种原因,当我尝试这个时,我无法让 "child['institution_name'] 工作。我得回去看看我的笔记......
    【解决方案2】:

    我猜列表推导式仍然是一种迭代形式,但至少简洁:

    your_list = [elem['institution_name'] for elem in inst_array[0]['children']]
    

    【讨论】:

      【解决方案3】:

      不确定您所说的“没有迭代”是什么意思。根据定义,您在这里所做的任何事情都必须涉及遍历列表。

      无论如何,这是一个尝试:

      institutions = set()
      for account in data:
          for child in account['children']:
              institutions.add(child['institution_name'])    
      

      【讨论】:

      • 对不起,语言混乱 - 你说得对。我一直在寻找一种列表理解技术,它在技术上仍然是迭代,但是以简写形式。 ://
      【解决方案4】:

      我不确定“没有迭代”到底是什么意思,但这里有一些可以工作的隐含迭代:

       [x['institution_name'] for x in inst_array[0]['children'] if x['institution_name']]
      

      【讨论】:

        【解决方案5】:

        类似:

        [ x['institution_name'] for x in inst_array[0]['children'] ]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多