Creating Dictionaries from Lists inside of Dictionaries

a 夏天 提交于 2019-12-08 07:18:33

问题


I'm quite new to Python and I have been stumped by a seemingly simple task. In part of my program, I would like to create Secondary Dictionaries from the values inside of lists, of which they are values of a Primary Dictionary.

I would also like to default those values to 0

For the sake of simplicity, the Primary Dictionary looks something like this:

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

What I would like my result to be is something like:

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

I understand the process should be to iterate through each list in the primaryDict, then iterate through the items in the list and then assign them as Dictionaries.

I've tried many variations of "for" loops all looking similar to:

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

I've also tried some methods of combining Dictionary and List comprehension, but when I try to index and print the Dictionaries with, for example:

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

I get the "TypeError: list indices must be integers or slices, not str", which I interpret that my 'apple' is not actually a Dictionary, but still a string in a list. I tested that by replacing 'apple' with 0 and it just returns 'apple', proving it true.

I would like help with regards to:

-Whether or not the values in my list are assigned as Dictionaries with value '0'

or

-Whether the mistake is in my indexing (in the loop or the print function), and what I am mistaken with

or

-Everything I've done won't get me the desired outcome and I should attempt a different approach

Thanks


回答1:


You can get the data structure that you desire via:

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}]}    

But the correct nested access would be:

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

If you actually want primaryDict['list_a']['apple'] to work, do instead

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}}



回答2:


Here is a dict comprehension that works:

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

There are two problems with your current code. First, you are trying to iterate over listKey, which is a string. This produces a sequence of characters.

Second, you should use something like

[{word: 0} for word in words]

in place of

{word:0 for word in listKey}



回答3:


You are close. The main issue is the way you iterate your dictionary, and the fact you do not append or assign your sub-dictionaries to any variable.

This is one solution using only for loops and 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}]}

A more Pythonic solution is to use a single list comprehension.

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

If you are using your dictionary for counting, which seems to be the implication, an even more Pythonic solution is to use 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})}

There are specific benefits attached to collections.Counter relative to normal dictionaries.




回答4:


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

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

print(primaryDict)

Output:

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

Hope this helps!




回答5:


@qqc1037, I checked and updated your code to make it working. I have mentioned the problem with your code as comments. Finally, I have also added one more example using list comprehension, map() & lambda function.

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
        }
    ]
}
"""

Another example: Using list comprehension, map(), lambda function

# 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
        }
    ]
}
"""


来源:https://stackoverflow.com/questions/50552803/creating-dictionaries-from-lists-inside-of-dictionaries

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!