【问题标题】:Python - Adding values to a set that is not equal to the dictionary keyPython - 将值添加到不等于字典键的集合中
【发布时间】:2024-01-17 08:58:01
【问题描述】:

我有一个制作完整图表的功能。它接受一个整数 n 的输入。该函数旨在返回一个字典,其中键是节点(0 到 n-1),值是具有不包括节点的数字的集合。我的功能目前是这样的:

def make_complete_graph(num_nodes):

    new_dict = {}
    new_set = set([])

    for i in range(0, num_nodes):
        new_dict[i] = new_set


    for key, value in new_dict.items():
        for j in range(0, num_nodes):
            if j != key:
                value.add(j)

    return new_dict

但它会返回:

{0: {0, 1, 2, 3, 4}, 1: {0, 1, 2, 3, 4}, 2: {0, 1, 2, 3, 4}, 3: {0, 1, 2, 3, 4}, 4: {0, 1, 2, 3, 4}}

当我希望它返回时

{0: {1, 2, 3, 4}, 1: {0, 2, 3, 4}, 2: {0, 1, 3, 4}, 3: {0, 1, 2, 4}, 4: {0, 1, 2, 3}}

似乎忽略了 if j != key 线。我该如何解决这个问题?

【问题讨论】:

  • 您使用了与每个值相同的集合。
  • 使用:new_dict[i] = new_set.copy()

标签: python dictionary set key


【解决方案1】:

您使用相同的集合 (new_set) 作为每个值。

如果你改变了

new_dict[i] = new_set

new_dict[i] = set()

那么每个值都有一个不同的集合,这些集合可以独立更新。

或者,您可以使用推导式简化整个代码:

def make_complete_graph(num_nodes):
    return {key:{n for n in range(num_nodes) if n!=key} for key in range(num_nodes)}

【讨论】:

    【解决方案2】:

    您对字典中的每个值都使用相同的set 并且所有add 操作都在相同的set 上执行的问题。结果是您的 dict 的所有值都等于您声明的集合以及您对其所做的所有修改。

    附带说明,您可以在没有第一个循环的情况下完成任务:

    def make_complete_graph(num_nodes):
        new_dict = {}
        for i in range(num_nodes):
            new_dict[i] = set(filter(lambda x: x!=i, range(num_nodes)))
        return new_dict
    
    print(make_complete_graph(5))
    # output: {0: {1, 2, 3, 4}, 1: {0, 2, 3, 4}, 2: {0, 1, 3, 4}, 3: {0, 1, 2, 4}, 4: {0, 1, 2, 3}}
    

    【讨论】:

      最近更新 更多