从词典中的列表创建词典

时间:2018-05-27 13:50:15

标签: python python-3.x loops dictionary dictionary-comprehension

我对Python很陌生,我被一个看似简单的任务所困扰。 在我的程序的一部分中,我想从列表中的值创建辅助字典,它们是主要字典的值。

我还想将这些值默认为0

为简单起见,主词典看起来像这样:

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

我希望我的结果是:

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

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

我尝试了许多“for”循环的变体,看起来类似于:

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

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

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

我得到“TypeError:list indices必须是整数或切片,而不是str”,我解释说我的'apple'实际上不是Dictionary,但仍然是列表中的字符串。我通过将'apple'替换为0来测试它,它只返回'apple',证明它是真的。

我想就以下问题提供帮助:

- 我的列表中的值是否被指定为值为“0”的字典

- 错误是在我的索引中(在循环或打印功能中),以及我误认为

- 我所做的一切都不会让我得到理想的结果,我应该尝试不同的方法

由于

5 个答案:

答案 0 :(得分:1)

这是一个有效的词典理解:

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

答案 1 :(得分:1)

你很亲密。主要问题是您迭代字典的方式,以及您不附加或将子字典分配给任何变量的事实。

这是一个仅使用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附加specific benefits

答案 2 :(得分:0)

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

希望这有帮助!

答案 3 :(得分:0)

您可以通过以下方式获取所需的数据结构:

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

答案 4 :(得分:0)

@ qqc1037 ,我检查并更新了您的代码以使其正常运行。我已经提到您的代码作为注释的问题。最后,我还添加了一个使用列表理解 map()&amp; lambda函数

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(),lambda函数

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