在for循环中创建python字典

时间:2019-11-14 18:47:19

标签: python python-3.x

我尝试创建一个字典,该字典与列表中的不同方面都有关系。

import collections
def create_dict(sides = ["A", "B", "C"]):
    my_dict = dict.fromkeys(sides, {})
    print("my_dict created here: ", my_dict)
    for k in sides:
        remining_list = collections.deque(sides)
        remining_list.remove(k)
        my_dict[k]["relation"] = dict.fromkeys(remining_list, 0)
    return my_dict

该字典是用空字典创建的: ('my_dict created here: ', {'A': {}, 'C': {}, 'B': {}}) 我希望输出为:

{'A': {'relation': {'B': 0, 'C': 0}},
 'B': {'relation': {'A': 0, 'C': 0}},
 'C': {'relation': {'A': 0, 'B': 0}}}

但是内部字典的每个值都将到达最后处理的字典,如下所示:

{'A': {'relation': {'A': 0, 'B': 0}},
 'C': {'relation': {'A': 0, 'B': 0}},
 'B': {'relation': {'A': 0, 'B': 0}}}

无法弄清楚我在哪一步做错了。当我遍历键时,我仅将其作为值提供给该特定键,而不是像输出中那样将其作为值。 还有没有更有效的方法来创建此字典?

为完成通话,请参见以下示例:

if __name__=="__main__":
    my_dict = create_dict()
    print(my_dict)

2 个答案:

答案 0 :(得分:3)

检查dict.fromkeys上的文档。返回的dict中的所有键都具有相同的值。您需要一个使用工厂而不是值的构造函数。

尝试my_dict = {i:{} for i in sides}

对于完整的解决方案,我将使用嵌套版本。

def create_dict(sides):
    return {i:dict(relation={j:0 for j in sides if j!=i}) 
               for i in sides}

请注意,如果顺序很重要,则以上内容仅适用于CPython 3.6或更高版本,或任何符合要求的python 3.7或更高版本。您可以在较早的版本中使用OrderedDict,但会降低性能。

还要注意,在默认参数中使用列表或其他可变类型通常被认为是不好的形式,因此您可能需要

def create_dict(sides=("A", "B", "C")):
    ...

相反。

答案 1 :(得分:0)

由于您已经在使用集合,因此建议您使用defaultdict

import collections


def create_dict(sides=["A", "B", "C"]):
    my_dict = collections.defaultdict(dict)
    for k in sides:
        remining_list = collections.deque(sides)
        remining_list.remove(k)
        my_dict[k]["relation"] = dict.fromkeys(remining_list, 0)
    return dict(my_dict.items())


print(create_dict())

输出

{'A': {'relation': {'B': 0, 'C': 0}}, 'B': {'relation': {'A': 0, 'C': 0}}, 'C': {'relation': {'A': 0, 'B': 0}}}