for循环中python字典的创建

2024-09-27 00:16:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个字典,它将有一个关系,从列表的不同方面采取

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

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)

Tags: 列表字典here关系mycreatecollectionsdict
2条回答

既然您已经在使用集合,我建议您使用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}}}

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

请注意,如果顺序很重要,则上述命令仅适用于cpython3.6或更高版本,或任何符合python3.7或更高版本的命令。您可以在早期版本中使用OrderedDict,但它有性能损失

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

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

相反

相关问题 更多 >

    热门问题