Список списков в словарь заданного формата c - PullRequest
0 голосов
/ 12 января 2020

У меня есть такой список:

l=[['a','b'],['c','d'],['a','b','c']....]

Я хочу, чтобы это было преобразовано в словарь следующего формата:

[{
            'data': {'id': 'one', 'label': 'a'},

        },
        {
            'data': {'id': 'two', 'label': 'b'},

        },
{
            'data': {'id': 'three', 'label': 'c'},

        },
        {
            'data': {'id': 'four', 'label': 'd'},

        }]

Сначала я пробовал следующий код:

dict_list = { i : len(l) for i in l }

Я получил следующую ошибку:

TypeError: unhashable type: 'list'

1 Ответ

2 голосов
/ 15 января 2020

Ошибка, которую вы получаете, связана с тем, что вы пытаетесь установить list в качестве ключа словаря. В следующем примере будут получены те же результаты:

>>> d = dict()
>>> d[['a', 'b']] = 123
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    d[['a', 'b']] = 123
TypeError: unhashable type: 'list'

Допустим, это сработает, но не создаст ожидаемый список, который вы получите sh. В результате получится что-то вроде этого:

{ ['a','b']: 2, 
  ['c','d']: 2, 
  ['a','b','c']: 3
}

Чтобы получить желаемый список, вам необходимо создать вложенный l oop (нативное решение) .

import inflect
p = inflect.engine()

l=[['a','b'],['c','d'],['a','b','c']]
new_list = list()
count = 1
already_used_labels = set()

# The nested loop...
for inner_list in l:
    for label in inner_list:
        if label in already_used_labels:
            continue
        new_list.append({'data': {'id': p.number_to_words(count), 'label': label}})
        count += 1
        already_used_labels.add(label)

Это приведет к:

[
 {'data': {'id': 'one', 'label': 'a'}}, 
 {'data': {'id': 'two', 'label': 'b'}},
 {'data': {'id': 'three', 'label': 'c'}}, 
 {'data': {'id': 'four', 'label': 'd'}}
]

PS

Для получения дополнительной информации о как преобразовать целые числа в слова ( inflect пакет).

...