2014-11-05 98 views
1

我正在使用名爲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

回答

2

可以使用獲得的二維表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')] 

注:後者效率有點低,所以你想用更先進的處理技術和/或數據結構來快速處理大型數據集。

2

你有什麼是字典其中包含其他的詞典。根據您所需的輸出推斷,我相信您需要將此數據結構轉換爲包含頂級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']]