Как преобразовать список в словарь, где некоторые ключи не имеют своих значений? - PullRequest
2 голосов
/ 19 марта 2019

У меня есть список объектов, число которых связано с точкой с запятой.Попытка преобразовать этот список в словарь, но некоторые ключи пропустят свои значения после преобразования.Пробовал использовать try / кроме, но не уверен, как сохранить значение по отдельности в словаре.

Пример:

t = ['Contact:10', 'Account:20','Campaign:', 'Country:', 'City:']

Объекты Campaign и Country не будут иметь значений при преобразовании.Я хотел бы передать или присвоить NaN в качестве значения словаря.

Я пробовал что-то подобное, но безрезультатно.

for objects in t:
    try:
        dictionary = dict(objects.split(":") for objects in t)
    except:
        pass

Любое предложение приветствуется.

Ответы [ 4 ]

8 голосов
/ 20 марта 2019

Вам не нужно пробовать / ловить:

t = ['Contact:10', 'Account:20','Campaign:', 'Country:', 'City:']
{ a: b for a,b in (i.split(':') for i in t) }

это дает:

{'Account': '20', 'Campaign': '', 'City': '', 'Contact': '10', 'Country': ''}

Если вы хотите None вместо пустой строки:

{ a: b if b else None for a,b in (i.split(':') for i in t) }
7 голосов
/ 20 марта 2019

Вы можете использовать выражение генератора с разделением каждого элемента и передать выходные данные конструктору dict:

dict(i.split(':') for i in t)

Это возвращает:

{'Contact': '10', 'Account': '20', 'Campaign': '', 'Country': '', 'City': ''}

Если вынапример, присвоить NaN в качестве значения по умолчанию, вместо этого вы можете сделать это с пониманием dict:

{a: b or float('nan') for i in t for a, b in (i.split(':'),)}

Это возвращает:

{'Contact': '10', 'Account': '20', 'Campaign': nan, 'Country': nan, 'City': nan}
1 голос
/ 20 марта 2019

Если значение отсутствует, это будет пустая строка

>>> 'foo:'.split(':')
['foo', '']

Так что это приводит нас к

data = {}
for pair in t:
    key, value = pair.split(':')
    data[key] = int(value) or float('nan')

Это можно немного исправить с помощью словарного понимания.

import string
pairs = map(string.split, t)
data = {key: int(value) or float('nan') for key, value in pairs}

Вы также можете отказаться помещать эти ключи в словарь, например

data = {}
for pair in t:
    key, value = pair.split(':')
    if value:
        data[key] = int(value) or float('nan')
0 голосов
/ 20 марта 2019
t = ['Contact:10', 'Account:20','Campaign:', 'Country:', 'City:']
d = {}

for obj in t:
    field = obj.split(':') 
    d[field[0]] = field[1] if field[1] else None

print(d)

Выход:

{'Country': '', 'City': '', 'Campaign': '', 'Account': '20', 'Contact': '10'}
...