Добавить неравную длину значений из списка в словарь - PullRequest
4 голосов
/ 10 февраля 2020

У меня есть словарь, ключи которого:

{'A', 'B', 'C', 'D'}

и некоторые примеры значений списка:

1- [(33.0, 134), (54.0, 113), (21.0, 120)]
2- [(25.0, 153)]
3- [()]

Я хочу применить значения списка к ключам словаря в целях. Ожидаемый результат будет в случае 1 -:

{'A' : 33.0,
'B' : 134,
'C' : 54.0,
'D' : 113}

в случае 2 -:

{'A' : 25.0,
'B' : 153,
'C' : NaN,
'D' : NaN}

в случае 3 -:

{'A' : NaN,
'B' : NaN,
'C' : NaN,
'D' : NaN}

Как я могу сделать это?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

Как словарь - замените 'NaN' на np.nan, если это значение, которое вы ищете.

>>> keys = ['A', 'B', 'C', 'D']

>>> l = [(33.0, 134), (54.0, 113), (21.0, 120)]
>>> dict(zip(keys,([x for sl in l for x in sl]+['NaN']*len(keys))[:len(keys)]))
{'A': 33.0, 'B': 134, 'C': 54.0, 'D': 113}

>>> l = [(25.0, 153)]
>>> dict(zip(keys,([x for sl in l for x in sl]+['NaN']*len(keys))[:len(keys)]))
{'A': 25.0, 'B': 153, 'C': 'NaN', 'D': 'NaN'}

>>> l = [(,)]
>>> dict(zip(keys,([x for sl in l for x in sl]+['NaN']*len(keys))[:len(keys)]))
{'A': 'NaN', 'B': 'NaN', 'C': 'NaN', 'D': 'NaN'}

Объяснение:

Мы используем zip(), чтобы сжать список ключей размером n со сглаженным списком кортежей, добавив в конец список значений n 'NaN', а затем отрубив первые n значения. Конструктор dict() принимает сжатый список в качестве аргумента.

0 голосов
/ 02 марта 2020

Принятый ответ слишком сложен, его можно легко реализовать:

from itertools import chain, zip_longest

keys = ('A', 'B', 'C', 'D') # use any ordered sequence

mapping = {
    1: [(33.0, 134), (54.0, 113), (21.0, 120)],
    2: [(25.0, 153)],
    3: [()]
}

print(dict(zip_longest(keys, chain.from_iterable(mapping[2]))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...