Python - добавление значений к набору, который не равен ключу словаря - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть функция, чтобы сделать полный график. Он принимает входные данные, которые являются целыми числами, 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 линия. Как мне go решить эту проблему?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Вы использовали тот же набор (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)}
0 голосов
/ 24 апреля 2020

Проблема в том, что вы используете один и тот же set для каждого значения в вашем словаре, и все операции add выполняются для одного и того же set. В результате все значения вашего dict равны объему, который вы объявили со всеми изменениями, которые вы для него сделали.

В качестве примечания вы можете выполнить sh вашу задачу без первого l oop:

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