Можно ли вставить словари со списком значений в al oop? - PullRequest
0 голосов
/ 24 февраля 2020
key, values
(0, 1)
(0, 2)
(0, 6)
(0, 7)
(1, 0)
(1, 2)
(2, 1)
(2, 0)
(3, 4)
(3, 5)
(4, 3)
(5, 3)
(6, 0)
(7, 0)

У меня проблема с моим python кодом. Я хочу вставить данные в словари в python. Я вижу ошибку, подобную этой:

N = len(g.nodes())

label_for_node = dict((i, v) for i, v in enumerate(g.nodes()))
node_for_label = dict((label_for_node[i], i) for i in range(N))


communities = dict((i, frozenset([i])) for i in range(N))
dq_dict = {}
H = MappedQueue()

partition = [[label_for_node[x] for x in c] for c in communities.values()]

dq_dict = dict(
        (i, dict( (j)
            for j in [ node_for_label[u] for u in g.neighbors(label_for_node[i])] if j != i)) 
                    for i in range(N))

TypeError: cannot convert dictionary update sequence element #0 to a sequence

Проблема в том, что я хочу вставить dict, когда индекс совпадает с предыдущим индексом. и я хочу вывести так:

{0: {1, 2, 6, 7}, 
1: {0, 2}, 
2: {1, 0}, 
3: {4, 5}, 
4: {3}, 
5: {3}, 
6: {0}, 
7: {0}}

Ответы [ 3 ]

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

Вы можете использовать collections.defaultdict.

from collections import defaultdict
l = [(0, 1), (0, 2), (0, 6), (0, 7), (1, 0), (1, 2), (2, 1), (2, 0), (3, 4), (3, 5), (4, 3), (5, 3), (6, 0), (7, 0)]
new_dict=defaultdict(set)
for k,v in l:
    new_dict[k].add(v)

defaultdict(set,
            {0: {1, 2, 6, 7},
             1: {0, 2},
             2: {0, 1},
             3: {4, 5},
             4: {3},
             5: {3},
             6: {0},
             7: {0}})
1 голос
/ 24 февраля 2020
def dictify(data):
    result = dict()
    for key, value in data:
        if key in result:
            result[key].add(value)
        else:
            result[key] = set([value])
    return result

Пример

>>> data
[(0, 1), (0, 2), (0, 6), (0, 7), (1, 0), (1, 2), (2, 1), (2, 0), (3, 4), (3, 5), (4, 3), (5, 3), (6, 0), (7, 0)]
>>> dictify(data)
{0: {1, 2, 6, 7},
 1: {0, 2},
 2: {0, 1},
 3: {4, 5},
 4: {3},
 5: {3},
 6: {0},
 7: {0}}

Этого также можно добиться с помощью collections.defaultdict

from collections import defaultdict
def dictify(data):
    result = defaultdict(set)
    for key, value in data:
        result[key].add(value)
    return result
0 голосов
/ 24 февраля 2020

Словарь setdefault метод построен именно для этой цели. Он принимает два аргумента: значение ключа и значение по умолчанию для ключа, если ключ еще не вставлен в словарь. Затем он возвращает значение, соответствующее ключу.

l = [(0, 1), (0, 2), (0, 6), (0, 7), (1, 0), (1, 2), (2, 1), (2, 0), (3, 4), (3, 5), (4, 3), (5, 3), (6, 0), (7, 0)]
z={}
for k,v in l:
    z.setdefault(k,set()).add(v)
...