簡體   English   中英

從嵌套字典中提取匹配值

[英]Extracting matching values from nested dictionary

如果值與列表中的值匹配,我正在嘗試從嵌套字典中提取值。

data = [
            {
                "id": 12345678,
                "list_id": 12345,
                "creator_id": 1234567,
                "entity_id": 1234567,
                "created_at": "2020-01-30T00:43:55.256-08:00",
                "entity": {
                    "id": 123456,
                    "type": 0,
                    "first_name": "John",
                    "last_name": "Doe",
                    "primary_email": "john@fakemail.com",
                    "emails": [
                        "john@fakemail.com"
                    ]
                }
            },
            {
                "id": 12345678,
                "list_id": 12345,
                "creator_id": 1234567,
                "entity_id": 1234567,
                "created_at": "2020-01-30T00:41:54.375-08:00",
                "entity": {
                    "id": 123456,
                    "type": 0,
                    "first_name": "Jane",
                    "last_name": "Doe",
                    "primary_email": "jane@fakemail.com",
                    "emails": [
                        "jane@fakemail.com"
                    ]
                }
            }
        ]

代碼如下。

match_list = ['jane@fakemail.com',[]]
first_names = []
email = []
for i in match_list:
    for record in data:
        if 'primary_email' == i:
            email.append(record.get('entity',{}).get('primary_email', None))
            first_names.append(record.get('entity',{}).get('first_name', None))       
print(first_names)
print(email)

而不是返回匹配的值,這只會返回空列表。 任何幫助在這里將不勝感激。

預期的輸出是

first_names = ['Jane'] and email = ['jane@fakemail.com']

將臨時值存儲在變量中,以使您的代碼更易於處理:

emails = []
names = []
match_list = ['jane@fakemail.com',[]]


for item in data:
    entry = item.get('entity', {})

    fName = entry.get('first_name', '')
    pMail = entry.get('primary_email', '')

    if pMail in match_list:
        print (fName)
        print (pMail)

        emails.append(pMail)
        names.append(fName)

輸出:

Jane
jane@fakemail.com

在代碼的第 6 行

    if 'primary_email' == i:

您將 match_list(即 'i')中的元素與字面上名為 'primary_email' 的字符串而不是實際的電子郵件進行比較。 因為 'jane@fakemail.com' 不等於 'primary_email'(字面意思是字符串)。

而是使用

if record['entity']['primary_email'] == i:

並且您的代碼應該按預期工作。

在您的代碼中,當您比較'primary_email'==i ,您總是會得到一個空列表,該列表將始終為False

將其更改為record['entity']['primary_email']==i

這里沒有必要使用get 。因為如果mail與任何primary_email都不匹配,那么什么都不會發生。 primary_email只有在滿足條件d['entity']['primary_email']==mail時才會添加。

試試這個 我稍微重構了你的代碼。

In [25]: for mail in match_list:
    ...:     for d in data:
    ...:         if d['entity']['primary_email']==mail:
    ...:             first_name.append(d['entity']['first_name'])
    ...:             emails.append(d['entity']['primary_email'])

輸出

In [26]: emails
Out[26]: ['jane@fakemail.com']

In [27]: first_name
Out[27]: ['Jane']

暫無
暫無

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

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