解析OrderedDict到Python列表

问题描述:

我正在使用名为Simple Salesforce的模块来查询我的Salesforce数据库中的数据。数据以OrderedDict的形式返回。我如何解析这个简单的Python列表。解析OrderedDict到Python列表

样品前两个项目,因为它查询时,返回:

OrderedDict([ 
    (u'totalSize', 418), 
    (u'done', True), 
    (u'records', [ 
     OrderedDict([ 
      (u'attributes', OrderedDict([ 
       (u'type', u'Case'), 
       (u'url', u'/services/Case/11111') 
       ])), 
      (u'Id', u'11111'), 
      (u'Subject', u'Case 1') 
      ]), 
     OrderedDict([ 
      (u'attributes', OrderedDict([ 
       (u'type', u'Case'), 
       (u'url', u'/services/Case/2222222') 
       ])), 
      (u'Id', u'2222222'), 
      (u'Subject', u'Case 2') 
      ]), 
     #... 
     ]) 
    ]) 

我不知道我有术语列表是正确的,但我想它在形式的多维表:

[('11111', 'Case 1'),('2222222', 'Case 2')] 

最终,我想内部加入此列表与另一个列表。这是设置数据的最佳方式吗?

所以这两个列表,我想内部连接将是:

表1:

List1 = [('11111', 'Case 1'),('2222222', 'Case 2')] # [ID, Subject] 

表2:

List2 = [('11111', 'April'),('2222222', 'March'),('333333', 'January')] # [ID, Date] 

所需的输出:

[('11111', 'Case 1','April'),('2222222', 'Case 2','March')] 
+0

你可以展示你自己尝试的吗? – Kasramvd 2014-11-05 17:34:31

+0

真的试过太多了。新的python和有点不知所措。 – user2242044 2014-11-05 17:37:36

+0

不确定从何入手 – user2242044 2014-11-05 17:38:36

可以使用获得的二维表list comprehension

from collections import OrderedDict 

od = OrderedDict([ 
     (u'totalSize', 418), 
     (u'done', True), 
     (u'records', [ 
      OrderedDict([ 
       (u'attributes', OrderedDict([ 
            (u'type', u'Case'), 
            (u'url', u'/services/Case/11111') 
            ])), 
       (u'Id', u'11111'), 
       (u'Subject', u'Case 1') 
       ]), 
      OrderedDict([ 
       (u'attributes', OrderedDict([ 
            (u'type', u'Case'), 
            (u'url', u'/services/Case/2222222') 
            ])), 
       (u'Id', u'2222222'), 
       (u'Subject', u'Case 2') 
       ]), 
      #... 
      ]) 
     ]) 

list1 = [(record['Id'], record['Subject']) for record in od['records']] 
print list1 # -> [(u'11111', u'Case 1'), (u'2222222', u'Case 2')] 

“内部加盟” 可以用代码像这样被模仿:

list2 = [('11111', 'April'), ('2222222', 'March'), ('333333', 'January')] 

joined = [item1+item2[1:] for item1 in list1 
          for item2 in list2 
           if item1[0] == item2[0]] 

print joined # -> [(u'11111', u'Case 1', 'April'), 
       #  (u'2222222', u'Case 2', 'March')] 

注:后者效率有点低,所以你想用更先进的处理技术和/或数据结构来快速处理大型数据集。

你有什么是字典其中包含其他的词典。根据您所需的输出推断,我相信您需要将此数据结构转换为包含*records密钥下每个元素的IdSubject的列表。

既然我们已经定义了这个需求,那么这个解决方案就很容易展现出来了:遍历records列表并遍历包含所需属性的元组。假设*对象叫做data。然后:

output = [] 
for record in data['records']: # Loop over all the records (each one an OrderedDict) in the list 
    subject = record['Subject'] # Extract the required information 
    identifier = record['Id'] 
    output.append((identifier, subject)) # Add the extracted info to the output list 

print(output) # Prints: [('11111', 'Case 1'), ('2222222', 'Case 2')] 

一旦你适应了基本思想,你其实可以浓缩这个循环到列表理解,这可能是更快创建,如果你的投入是很大的。以下代码行等同于上面的循环,但是更清晰可读(对于熟悉Python结构的人,无论如何)。

output = [(record['Id'], record['Subject']) for record in data['records']]