Создать словарь из списков с условием - PullRequest
0 голосов
/ 07 февраля 2019

Вот что у меня есть:

ports = [ 1111, 2222, 3333 ]
keys = ['port', 'target_port', 'name']
ports = [dict.fromkeys(keys, port) for port in ports]

это приводит к:

[
    {
        "port": 1111,
        "target_port": 1111,
        "name": 1111
    }
    xxx
]

проблема в том, что значение "name" должно быть строкой.Как я могу добавить условие для понимания списка?

РЕДАКТИРОВАТЬ: все остальные значения должны оставаться целыми числами
РЕДАКТИРОВАТЬ: мой обходной путь на данный момент:

for port_dict in ports:
    port_dict['name'] = str(port_dict['port'])

Завершено с использованием обратной стороны принятого ответа, поэтому я могу потенциально добавить ключив конец списка:

keys = ['name', 'port', 'target_port']
ports = [{**dict.fromkeys(keys[1:], port), "name": str(port)}
         for port in ports]

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Вы должны быть в состоянии сделать это, используя ниже

[{key: str(port) if key=="name" else port for key in keys} for port in ports]
0 голосов
/ 07 февраля 2019

Вместо того, чтобы делать dict.fromkeys(), вы можете просто выписать это, вложив в текстовое понимание вложение слов:

ports = [ {key: (str(port) if key == "name" else port) for key in keys}
          for port in ports]
0 голосов
/ 07 февраля 2019

Даниэль Месехо дал хорошее решение, но для немного масштабируемости вы можете определить свою собственную функцию для использования в словарном понимании:

def force_str(val, key, str_keys):
    if key in str_keys:
        return str(val)
    else:
        return val

result = [{k: force_str(p, k, ['name']) for k in keys} for p in ports]

# [{'port': 1111, 'target_port': 1111, 'name': '1111'}, 
#  {'port': 2222, 'target_port': 2222, 'name': '2222'}, 
#  {'port': 3333, 'target_port': 3333, 'name': '3333'}]

Это позволяет вам передавать произвольное количество str_keys в вашу функцию, и key может быть в любом положении.

0 голосов
/ 07 февраля 2019

Вы можете сделать:

ports = [ 1111, 2222, 3333 ]
keys = ['port', 'target_port', 'name']

result = [{ **dict.fromkeys(keys[:2], port), "name" : str(port) } for port in ports]
print(result)

Вывод

[{'target_port': 1111, 'name': '1111', 'port': 1111}, {'target_port': 2222, 'name': '2222', 'port': 2222}, {'target_port': 3333, 'name': '3333', 'port': 3333}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...