簡體   English   中英

高度嵌套數據的Python字典/列表理解

[英]Python Dictionary / List Comprehension for highly nested data

我從API請求返回了一堆json,該API請求的結構化(我認為)是一個字典,其中包含我需要的大多數數據在第一個列表中的列表,而該列表又包含我所需要的每個項目的字典評估,第一項是標識項的簡單key:value對,第二項是key:value對,其中key是對源數據中關系的引用,而value是另一個列表,其中包含每個條目/屬性的字典。

我可能已經搞砸了,但這就是它的樣子。 '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()

我知道更好的方法是通過字典/列表理解。 我只是想不通如何在字典/列表之間進行如此多的嵌套切換。 (我本月才開始學習Python。)這可能嗎?

假設您有一個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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM