关于python:从词典中的列表创建词典

Creating Dictionaries from Lists inside of Dictionaries

我对python很陌生,我被一个看似简单的任务给难住了。在我的部分程序中,我想从列表中的值创建辅助字典,这些值是主字典的值。

我还想将这些值默认为0

为了简单起见,主词典如下所示:

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

我希望我的结果是:

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

我理解这个过程应该是遍历primarydict中的每个列表,然后遍历列表中的项目,然后将它们指定为字典。

我尝试过许多不同的"for"循环,它们看起来都类似于:

1
2
3
for listKey in primaryDict:
    for word in listKey:
        {word:0 for word in listKey}

我还尝试了一些结合字典和列表理解的方法,但是当我尝试索引和打印字典时,例如:

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

我得到了"typeerror:列表索引必须是整数或片,而不是str",我解释说我的"apple"实际上不是字典,但仍然是列表中的字符串。我用0替换了"apple",然后它只返回"apple",证明了这一点。

我想为以下方面提供帮助:

-是否将列表中的值指定为值为"0"的词典

-无论错误是在索引中(在循环中还是在打印函数中),以及我所犯的错误

-我做的每一件事都不能达到预期的效果,我应该尝试一种不同的方法。

谢谢


你是关闭的。主要的问题是冰的路你重复你的词典,而事实不append你或你的assign子词典的任何两个变量。

这是一只for溶液循环使用list.append鸭。

1
2
3
4
5
6
7
8
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}]}

一个更大Python的解决方案是使用一个单一的战略的理解。

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

如果你是用你的词典的依赖,这似乎是个相当有趣的implication,Python的解决方案是使用collections.Counter

1
2
3
4
5
6
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特异性相关的两个正常的词典。


这是一个字典,作品的理解:

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

有两个问题与你当前的代码。第一,你是想listKey遍历,这是一个字符串。这产生一个序列的性质。

第二,你应该使用之类的东西

1
[{word: 0} for word in words]

在地方

1
{word:0 for word in listKey}


"qqc1037,检查和更新你的代码,使它工作。有上述问题的代码为与你的评论。终于,你也加了一个用以战略的理解,map(&;λ)的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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(),氧功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 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
        }
    ]
}
"""

你可以把数据结构:通过你的欲望

1
2
3
4
5
6
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}]}

但正确的嵌套的访问将是:

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

如果你想让我做primaryDict['list_a']['apple']工作,而不是

1
2
3
4
5
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}}


1
2
3
4
5
6
primaryDict = {'list_a':['apple', 'orange'], 'list_b':['car', 'bus']}

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

print(primaryDict)

输出:

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

希望这helps!