【问题标题】:Nested OrderedDict to nested list with varying levels of nesting将 OrderedDict 嵌套到具有不同嵌套级别的嵌套列表
【发布时间】:2016-06-21 07:36:44
【问题描述】:

我正在使用simple_salesforce 查询 CRM 关系数据库。使用SOQL 查询数据,这是SQL 的变体,专门用于Salesforce。

它返回嵌套的有序字典。在“加入”时,如果没有记录,则返回 None。如果有记录,则返回OrderedDict。我的循环似乎不是最有效的,因为它重复了几行。我正在寻找一种更简洁的方式来编写循环。

使用的查询:

select Id, Subject, Account.Name, Opportunity.Name From Case where ID = '500xxxxxxxxxxxxx'

代码:

from collections import OrderedDict

od = OrderedDict([
    (u'totalSize', 1),
    (u'done', True),
    (u'records', [OrderedDict([
        (u'attributes', OrderedDict([
            (u'type', u'Case'),
            (u'url', u'/services/data/v29.0/sobjects/Case/500xxxxxxxxxxxxxxxx')
        ])
         ),
        (u'Id', u'500xxxxxxxxxxxxxxxx'),
        (u'Subject', u"Sample Case 1"),
        (u'Account', OrderedDict([
            (u'attributes', OrderedDict([
                (u'type', u'Account'),
                 (u'url', u'/services/data/v29.0/sobjects/Account/001xxxxxxxxxxxxxxxx')
                 ])
             ),
            (u'Name', u'Sample Account 1')
        ])),
        (u'Opportunity', None)]
    )])])


output = []

def get_items(this_item):
   for key, value in this_item.iteritems():
       if key <> 'attributes':
           if type(value) is OrderedDict:
              for key, value in value.iteritems():
                  if key <> 'attributes':
                      record.append(str(value))
           else:
               record.append(str(value))


for item in od['records']:
   record = []
   record.append(get_items(item))


   output.append(record)
print output

输出:

[['500xxxxxxxxxxxxxxxx', 'Sample Case 1', 'Sample Account 1', 'None']]

【问题讨论】:

  • 请发布预期输出
  • @MaxU 刚刚发布了输出和期望。谢谢。
  • 只检查value 的类型,如果是collections.OrderedDict就不要打印了
  • @MaxU 然后将 'Sample Account 1' 从输出中排除,不是吗?
  • 并且您不想/不允许在脚本中指定记录名称:'Id'、'Subject'、'Account.Name'、'Opportunity'?

标签: python python-2.7 lambda salesforce ordereddictionary


【解决方案1】:

试试这个:

def get_rec_vals(rec):
    ret_list = []
    for key,val in rec.items():
        if key == 'attributes': continue
        if isinstance(val, OrderedDict):
            # recursive call 
            ret_list.extend(get_rec_vals(val))
        else:
            ret_list.append(val)
    return ret_list


output = [get_rec_vals(rec) for rec in od['records']]
print(output)

输出:

[['500xxxxxxxxxxxxxxxx', 'Sample Case 1', 'Sample Account 1', None]]

PS 我不确定它是否适用于多条记录,因此您需要提供至少两条记录...

【讨论】:

  • @这行得通。提供多个案例示例很痛苦(因为出于隐私原因,我需要创建假数据集)。然而,我确实尝试了多条记录,它似乎工作正常。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2021-08-09
  • 2020-06-06
  • 2018-08-02
相关资源
最近更新 更多