将OrderedDict解析为Python列表

将OrderedDict解析为Python列表,python,list,python-2.7,join,Python,List,Python 2.7,Join,我正在使用一个名为Simple Salesforce的模块从我的Salesforce数据库中查询数据。数据以OrderedICT的形式返回。如何将其解析为简单的python列表 查询时返回的前两个条目的示例: OrderedDict([ (u'totalSize', 418), (u'done', True), (u'records', [ OrderedDict([ (u'attributes', OrderedDict([

我正在使用一个名为Simple Salesforce的模块从我的Salesforce数据库中查询数据。数据以OrderedICT的形式返回。如何将其解析为简单的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')]

你所拥有的是一个包含其他内容的dict。从您期望的输出推断,我相信您想要的是将此数据结构转换为一个列表,其中包含顶级
记录下每个元素的
Id
主题

既然我们已经定义了需求,那么解决方案就很容易出现了:在
记录
列表上循环,并生成包含所需属性的元组。假设顶级对象称为
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结构的人来说)


您可以使用以下方法获得二维表格:

“内部连接”可以用如下代码进行模拟:

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')]

注意:后者有点低效,因此您可能希望使用更先进的处理技术和/或数据结构来快速处理大型数据集。

您能展示一下您自己的尝试吗?我确实尝试了太多。python新手,有点不知所措。不确定从哪里开始不确定我是否理解你最后的评论。你能解释一下你的意思吗?我认为你的嵌套
OrderedDict
是错误的,你没有完全复制它!你还需要解释更多关于你的要求!
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')]