我尝试创建一个字典,该字典与列表中的不同方面都有关系。
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)
答案 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}}}