Python字典/列表理解高度嵌套的数据

时间:2018-01-31 20:13:22

标签: python json list dictionary

我从一个API请求返回了一堆json,这个请求的结构化(我认为)是一个包含列表的字典,其中我需要的大部分数据都在第一个列表中,而那个列表在转换包含我评估的每个项目的词典,第一项是一个简单的键:标识项目的值对,第二项是键:值对,其中键是对源中关系的引用数据,该值是另一个列表,其中包含每个条目/属性的字典。

我可能已经搞砸了,但这正是它的样子。 ' class_id'的值都是唯一的,以及' tag_id'的值在子集中是唯一的,但可以重复或(在第一个条目中的空括号的情况下)根本不存在。

{'Data': [{'class_id': 'class_000',
       'relationship_id': []},
      {'class_id': 'class_001',
       'relationship_id': [{'tag_id': 'tag_000'},
                           {'tag_id': 'tag_001'},
                           {'tag_id': 'tag_002'},
                           {'tag_id': 'tag_003'},
                           {'tag_id': 'tag_004'}]},
      {'class_id': 'class_002',
       'relationship_id': [{'tag_id': 'tag_000'},
                           {'tag_id': 'tag_003'},
                           {'tag_id': 'tag_055'},
                           {'tag_id': 'tag_777'},]}],
'ResponseCode': 200, 'ResponseText': 'OK'}

我需要的是将class_id和tag_id传递给每个实例的变量。因此,我想要的输出将是获得第一对并将其设置为变量的东西,以便我可以评估它,然后执行下一个,依此类推,直到达到最后一对。

更新:我发布了目前用于更好上下文的实际功能,我必须使用MySQL命令中的变量,在这种情况下,' a_class_id'和' a_tag_id':

data = json_response['Data']           
for data_subset in data:
a_class_id = data_subset['class_id']
relationship_subset = data_subset['relationship_id']
count = 0

for tag_total in relationship_subset:
    tag_total = relationship_subset[count]
    count = count + 1
    a_tag_id = tag_total['tag_id']
    cursor.execute("SELECT event_key FROM events WHERE source_unique_id='{}'".format(a_class_id))
    fetched_event_key = cursor.fetchone()

    if fetched_event_key != None:
        matched_event_key=(fetched_event_key[0])
        else: pass

    cursor.execute("SELECT tag_key FROM tags WHERE source_unique_id='{}'".format(a_tag_id))
    fetched_tag_key = cursor.fetchone()
    matched_tag_key = (fetched_tag_key[0])
    cursor.execute("SELECT event_tag_key FROM event_tags WHERE event_tags.event_key='{}' AND event_tags.tag_key='{}'".format(matched_event_key,matched_tag_key))
    matched_event_tag_key = cursor.fetchone()

我知道更好的方法是使用字典/列表推导。我只是无法弄清楚如何在dicts / lists之间进行这种嵌套切换。 (我这个月刚刚开始学习Python。)这可能吗?

1 个答案:

答案 0 :(得分:1)

假设您有一个带有类名和标记名

的函数do_something
def do_something(klass, tag):
    ...

然后,您可以使用以下方法对给定数据结构中的所有类和标记组合进行评估:

results = [do_something(klass["class_id"], tag["tag_id"]) 
           for klass in data["Data"] for tag in klass["relationship_id"]]

例如do_something只是

>>> def do_something(klass, tag):
...     return "{}:{}".format(klass, tag)

然后

>>> [do_something(klass["class_id"], tag["tag_id"])
... for klass in data["Data"] for tag in klass["relationship_id"]]
['class_001:tag_000', 'class_001:tag_001', 'class_001:tag_002', 'class_001:tag_003', 'class_001:tag_004', 'class_002:tag_000', 'class_002:tag_003', 'class_002:tag_055', 'class_002:tag_777']