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