Извлечение совпадающих значений из вложенного словаря - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь извлечь значения из вложенного словаря, если значение соответствует значению в списке.

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']

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

В вашем коде вы всегда получите пустой список при сравнении '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'])

output

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

In [27]: first_name
Out[27]: ['Jane']
1 голос
/ 12 февраля 2020

Храните временные значения в переменных, чтобы облегчить обработку вашего кода:

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
0 голосов
/ 12 февраля 2020

В 6-й строке вашего кода

    if 'primary_email' == i:

Вы сравниваете элементы из match_list (то есть 'i') буквально в строку с именем primary_email вместо реальной электронной почты. поскольку 'jane@fakemail.com' не равно 'primary_email' (буквально строка).

Вместо этого используйте

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

, и ваш код должен работать так, как ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...