我使用名为Simple Salesforce的模块来查询Salesforce数据库中的数据。数据以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 :(得分:2)
你所拥有的是一个包含其他内容的词典。从您想要的输出推断,我认为您想要的是将此数据结构转换为包含顶级Id
键下每个元素的Subject
和records
的列表。
现在我们已经定义了需求,解决方案很容易呈现:循环遍历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']]
答案 1 :(得分: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')]
注意:后者效率低下,因此您希望使用更先进的处理技术和/或数据结构来快速处理大型数据集。