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子词典的任何两个变量。
这是一只
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的解决方案是使用
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})} |
有两个附加的好处
这是一个字典,作品的理解:
1 | {k: [{v: 0} for v in vs] for k, vs in primaryDict.items()} |
有两个问题与你当前的代码。第一,你是想
第二,你应该使用之类的东西
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 |
如果你想让我做
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!