Извлечение набора ребер из кортежа - PullRequest
0 голосов
/ 28 апреля 2018

Я создал следующую программу. Требуется вход G, который состоит из вершин графа, а также ребер и соответствующих весов ребер. Цель программы - извлечь только края

def edges(G):     
    E =[]     
    for i in G[1]:         
        E.append(i[0])     
    return E  
print (edges(G))

На следующем входе

G = [({'a', 'b'}, 4), ({'a', 'c'}, 6), ({'a', 'd'}, 8), ({'b', 'e'}, 1) ,
      ({'b', 'f'}, 9), ({'c', 'f'}, 3), ({'d', 'g'}, 7), ({'d', 'h'}, 0)]

Получается следующий вывод:

[{'a', 'b'}, {'a', 'c'}, {'a', 'd'}, {'e', 'b'}, {'f', 'b'}, {'f', 'c'}, {'g', 'd'}, {'h', 'd'}]

Вывод, который я пытаюсь получить:

[{'a', 'b'}, {'a', 'c'}, {'a', 'd'}, {'b', 'e'}, {'b', 'f'}, {'c', 'f'}, {'d', 'g'}, {'d', 'h'}]

Может кто-нибудь объяснить, почему извлеченные мной кортежи переупорядочены?

1 Ответ

0 голосов
/ 28 апреля 2018

A set - неупорядоченная коллекция . То, что вы запрашиваете, невозможно.

Лучшее, что вы можете сделать, - это использовать упорядоченную коллекцию, например list или tuple. Ниже приведен пример.

res = [tuple(sorted(x[0])) for x in G]

print(res)

[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'e'),
 ('b', 'f'), ('c', 'f'), ('d', 'g'), ('d', 'h')]

Это также возможно функционально, но грязно, так как Python не имеет встроенной композиции функций. Для композиции вы можете использовать стороннюю библиотеку toolz.

from operator import itemgetter
from toolz import compose

res = list(map(compose(tuple, sorted, itemgetter(0)), G))
...