Создание словарей из списков внутри словарей - PullRequest
0 голосов
/ 27 мая 2018

Я довольно новичок в Python, и я был озадачен, казалось бы, простой задачей.В части моей программы я хотел бы создать вторичные словари из значений внутри списков, для которых они являются значениями основного словаря.

Я также хотел бы установить значения по умолчанию 0

Ради простоты Основной словарь выглядит примерно так:

primaryDict = {'list_a':['apple', 'orange'], 'list_b':['car', 'bus']}

Я хотел бы, чтобы мой результат был примерно таким:

{'list_a':[{'apple':0}, {'orange':0}], 'list_b':[{'car':0}, {'bus':0}]}

Я понимаю процессследует выполнить итерацию по каждому списку в primaryDict, а затем выполнить итерации по элементам в списке и затем назначить их в качестве словарей.

Я перепробовал множество вариантов циклов "for", все они выглядят примерно так:

for listKey in primaryDict:
    for word in listKey:
        {word:0 for word in listKey}

Я также попробовал некоторые методы объединения словаря и списков, но когда я пытаюсь индексировать и печатать словари, например:

print(primaryDict['list_a']['apple'])

, я получаю "TypeError: индексы списка должны быть целыми числами или кусочками, а не str ", что, как я понимаю, мое« яблоко »на самом деле не словарь, а строка в списке.Я проверил это, заменив «яблоко» на 0, и он просто возвращает «яблоко», подтвердив его истинность.

Я хотел бы помочь в отношении:

-Если значения в моем или нетсписок присваивается как словари со значением '0'

или

- есть ли ошибка в моем индексировании (в цикле или в функции печати), и в чем я ошибаюсь с

или

-Все, что я сделал, не даст мне желаемого результата, и я должен попробовать другой подход

Спасибо

Ответы [ 5 ]

0 голосов
/ 27 мая 2018

@ qqc1037 , я проверил и обновил ваш код, чтобы он заработал.Я упомянул проблему с вашим кодом в качестве комментариев.Наконец, я также добавил еще один пример, используя понимание списка , map () & лямбда-функция .

import json 

secondaryDict = {}

for listKey in primaryDict:
    new_list = [] # You did not define any temporary list
    for word in primaryDict [listKey]: # You forgot to use key that refers the list
        new_list.append( {word:0}) # Here you forgot to append to list
    secondaryDict2.update({listKey: new_list}) # Finally, you forgot to update the secondary dictionary

# Pretty printing dictionary
print(json.dumps(secondaryDict, indent=4));

"""
{
    "list_a": [
        {
            "apple": 0
        },
        {
            "orange": 0
        }
    ],
    "list_b": [
        {
            "car": 0
        },
        {
            "bus": 0
        }
    ]
}
"""

Другой пример: Использование списка, map (), лямбда-функция

# Using Python 3.5.2
import json

primaryDict = {'list_a':['apple', 'orange'], 'list_b':['car', 'bus']}

secondaryDict = dict(map(lambda key: (key, [{item:0} for item in primaryDict[key]]), list(primaryDict) ))

# Pretty printing secondary dictionary
print(json.dumps(secondaryDict, indent=4))

"""
{
    "list_a": [
        {
            "apple": 0
        },
        {
            "orange": 0
        }
    ],
    "list_b": [
        {
            "car": 0
        },
        {
            "bus": 0
        }
    ]
}
"""
0 голосов
/ 27 мая 2018

Вы рядом.Основная проблема заключается в том, как вы выполняете итерацию в своем словаре, а также в том, что вы не добавляете и не присваиваете свои словари к какой-либо переменной.

Это одно решение, использующее только циклы for и list.append.

d = {}
for k, v in primaryDict.items():
    d[k] = []
    for w in v:
        d[k].append({w: 0})

{'list_a': [{'apple': 0}, {'orange': 0}],
 'list_b': [{'car': 0}, {'bus': 0}]}

Более Pythonic решение состоит в том, чтобы использовать понимание единого списка.

d = {k: [{w: 0} for w in v] for k, v in primaryDict.items()}

Если вы используете свой словарь для подсчета, что, как представляется, подразумеваетсяеще более Pythonic решение состоит в том, чтобы использовать collections.Counter:

from collections import Counter

d = {k: Counter(dict.fromkeys(v, 0)) for k, v in primaryDict.items()}

{'list_a': Counter({'apple': 0, 'orange': 0}),
 'list_b': Counter({'bus': 0, 'car': 0})}

Есть специфических преимуществ , прикрепленных к collections.Counter относительно обычных словарей.

0 голосов
/ 27 мая 2018

Вы можете получить желаемую структуру данных с помощью:

primaryDict = {'list_a':['apple', 'orange'], 'list_b':['car', 'bus']}
for k, v in primaryDict.items():
    primaryDict[k] = [{e: 0} for e in v]

# primaryDict
{'list_b': [{'car': 0}, {'bus': 0}], 'list_a': [{'apple': 0}, {'orange': 0}]}    

Но правильный вложенный доступ будет:

print(primaryDict['list_a'][0]['apple'])  # note the 0

Если вы действительно хотите, чтобы primaryDict['list_a']['apple'] работал,сделать вместо

for k, v in primaryDict.items():
    primaryDict[k] = {e: 0 for e in v}

# primaryDict
{'list_b': {'car': 0, 'bus': 0}, 'list_a': {'orange': 0, 'apple': 0}}
0 голосов
/ 27 мая 2018

Вот толкование, которое работает:

{k: [{v: 0} for v in vs] for k, vs in primaryDict.items()}

Есть две проблемы с вашим текущим кодом.Сначала вы пытаетесь перебрать listKey, что является строкой.Это создает последовательность символов.

Во-вторых, вы должны использовать что-то вроде

[{word: 0} for word in words]

вместо

{word:0 for word in listKey}
0 голосов
/ 27 мая 2018
primaryDict = {'list_a':['apple', 'orange'], 'list_b':['car', 'bus']}

for listKey  in primaryDict:
    primaryDict[i] = [{word:0} for word in primaryDict[listKey]]

print(primaryDict)

Вывод:

{'list_a':[{'apple':0}, {'orange':0}], 'list_b':[{'car':0}, {'bus':0}]}

Надеюсь, это поможет!

...