解析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')]
答
可以使用获得的二维表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
密钥下每个元素的Id
和Subject
的列表。
既然我们已经定义了这个需求,那么这个解决方案就很容易展现出来了:遍历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']]
你可以展示你自己尝试的吗? – Kasramvd 2014-11-05 17:34:31
真的试过太多了。新的python和有点不知所措。 – user2242044 2014-11-05 17:37:36
不确定从何入手 – user2242044 2014-11-05 17:38:36