суммирование значений в словаре - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю с сетью X, которая является библиотекой на основе графов в Python.Я усек данные здесь, потому что это просто список словарей.

Я хочу суммировать количество треугольников на графике.

import networkx as nx
for i in graphT:
    print(nx.triangles(i))

Это генерирует

{0: 1, 1: 0, 2: 0, 3: 1, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 1, 11: 0, 12: 2, 13: 0, 14: 2, 15: 1, 16: 1, 17: 0, 18: 0, 19: 1, 20: 0, 21: 0, 22: 0, 23: 0, 24: 0, 25: 5, 26: 1, 27: 0, 28: 0, 29: 1, 30: 0, 31: 0, 32: 0, 33: 4, 34: 1, 35: 3, 36: 1, 37: 1, 38: 2, 39: 1}
{0: 1, 1: 0, 2: 0, 3: 1, 4: 2, 5: 0, 6: 0, 7: 0, 8: 0, 9: 2, 10: 2, 11: 0, 12: 2, 13: 2, 14: 3, 15: 2, 16: 1, 17: 0, 18: 1, 19: 0, 20: 0, 21: 0, 22: 0, 23: 0, 24: 0, 25: 2, 26: 2, 27: 0, 28: 0, 29: 1, 30: 0, 31: 0, 32: 0, 33: 2, 34: 0, 35: 2, 36: 1, 37: 1, 38: 1, 39: 2}
{0: 1, 1: 1, 2: 0, 3: 2, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 2, 11: 0, 12: 4, 13: 0, 14: 3, 15: 4, 16: 1, 17: 1, 18: 0, 19: 0, 20: 0, 21: 0, 22: 1, 23: 0, 24: 0, 25: 3, 26: 2, 27: 0, 28: 0, 29: 1, 30: 0, 31: 0, 32: 0, 33: 1, 34: 1, 35: 2, 36: 1, 37: 1, 38: 2, 39: 2}

......

Теперь я хочу суммировать значения

, для которых

for i in graphT:
    #print(nx.triangles(i))
    for k, v in nx.triangles(i).items():
        #print(i.number_of_edges(), v)
        #print(jt.append(v))
        vi= v
        print(k, vi)
        break

, который генерирует кортеж для ключа '0'.Я усек данные здесь с оператором перерыва.

(0, 1)
(0, 1)
(0, 1)
(0, 1)
(0, 1)
(0, 1)
(0, 1)
(0, 5)
(0, 2)
(0, 4)
(0, 3)
(0, 5)
(0, 2)
(0, 3)
(0, 4)
(0, 1)
(0, 4)
(0, 1)
(0, 8)
(0, 5)
(0, 2)
(0, 4)
(0, 3)
(0, 5)
(0, 6)
(0, 3)
(0, 3)
(0, 11)
(0, 7)
(0, 18)
(0, 9)
(0, 8)
(0, 4)
(0, 12)
(0, 22)
(0, 14)
(0, 23)
(0, 18)
(0, 2)
(0, 41)
(0, 8)
(0, 29)
(0, 13)
(0, 12)
(0, 53)
(0, 12)

Как бы я суммировал значения этого кортежа, который является вторым элементом?Если я использую sum(v) или sum(vi), я получаю TypeError: 'int' object is not iterable.

Это дает мне решение:

j= [(sum(n for _, n in nx.triangles(i).items()), i.number_of_edges()) for i in graphT]

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете получить доступ ко всем значениям словаря с помощью values.Затем суммируйте те.Итак, для этого случая:

import networkx as nx
G = nx.fast_gnp_random_graph(1000,0.05)
triangle_counts = nx.triangles(G)
triangle_sum = sum(triangle_counts.values())
number_of_triangles = triangle_sum/3
print(number_of_triangles)
> 20444.0

Обратите внимание, что каждый треугольник учитывается один раз на узел, поэтому я разделил на 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...