Как добавить ключ и значение, используя список и вхождение в список словарей? - PullRequest
3 голосов
/ 11 апреля 2019

У меня есть список словарей, который является

ip_list = [{'1403': [-56, -58], 'data': '1'},
           {'1403': [-56, -58], 'data': '0'}]

Теперь мне нужно добавить новый ключ (т. Е. «Mac») и значение (т. Е. «Xyz») в словаре, если словарьсодержит 'data' = 1, и результат должен быть,

expected_outcome = [{'1403': [-56, -58], 'data': '1', 'mac':'xyz'},
                    {'1403': [-56, -58], 'data': '0'}]

Я пробовал с,

list_dict_comp = [dict(item, **{'mac':'xyz'}) for item in ip_list]

Принимая во внимание, что приведенное выше выражение дает,

list_dict_comp = [{'1403': [-56, -58], 'data': '1', 'mac':'xyz'},
                  {'1403': [-56, -58], 'data': '0', 'mac':'xyz'}]

Может ли кто-нибудь помочь мне в достижении «ожидаемого результата» , использующего и списки, и дикты, вместе в одном выражении?

Ответы [ 3 ]

3 голосов
/ 11 апреля 2019

Причина, по которой вы получаете

list_dict_comp = [{'1403': [-56, -58], 'data': '1', 'mac':'xyz'},
                  {'1403': [-56, -58], 'data': '0', 'mac':'xyz'}]

, заключается в том, что вы добавляете {'mac':'xyz'} к каждому элементу в списке.

Почему бы не упростить свою жизнь, а просто пройтись по ip_listдобавьте {'mac':'xyz'}, если в ключах элемента ip_list присутствует data, а значение для data равно '1'

ip_list = [{'1403': [-56, -58], 'data': '1'},
           {'1403': [-56, -58], 'data': '0'}]

for ip in ip_list:
    if ip.get('data') == '1':
        ip['mac'] = 'xyz'
print(ip_list)
#[{'1403': [-56, -58], 'data': '1', 'mac': 'xyz'}, {'1403': [-56, -58], 'data': '0'}]
1 голос
/ 11 апреля 2019

Используйте list comprehensions, чтобы решить эту проблему с помощью if-else.Вы можете добавлять элементы в словарь, используя функцию update() -

ip_list = [{'1403': [-56, -58], 'data': '1'}, {'1403': [-56, -58], 'data': '0'}]

[i.update({'mac': 'xyz'}) if i['data']=='1' else i for i in ip_list]         

print(ip_list)
     [{'1403': [-56, -58], 'data': '1', 'mac': 'xyz'},
      {'1403': [-56, -58], 'data': '0'}]
1 голос
/ 11 апреля 2019
ip_list = [{'1403': [-56, -58], 'data': '1'},
           {'1403': [-56, -58], 'data': '0'}]
res = [dict(item, **{'mac':'xyz'}) if 'data' in item and item['data'] == '1' else item for item in ip_list]
print(res)
# [{'1403': [-56, -58], 'data': '1', 'mac': 'xyz'}, {'1403': [-56, -58], 'data': '0'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...