Как определить возможный шаблон цепочки из списка кортежей

#python #python-3.x #networkx

Вопрос:

Отредактированный

В поисках простого или оптимизированного способа реализации приведенной ниже проблемы, похоже, с помощью «networkx» мы можем достичь этого довольно легко (благодаря БЕНИ в разделе комментариев).

 input_list  = [('A','B'),('D','C'),('C','B'),('E','D'),('I','J'),('L','K'),('J','K')] # path map

def get_chain_list(sp, d):
    global result
    result.append(sp)
    if sp in d : get_chain_list(d[sp], d)
    return tuple(result)

d = dict(input_list)
s1 = set(d.keys())
s2 = set(d.values())
sps = s1 - s2

master_chain = []
for sp in sps :
    result = []
    master_chain.append(get_chain_list(sp, d))

output_list = sorted(master_chain, key=len, reverse=True)

print(output_list)
[('E', 'D', 'C', 'B'), ('I', 'J', 'K'), ('A', 'B'), ('L', 'K')] # Chains in input list
 

Комментарии:

1. Я не думаю, что для этого вам нужно машинное обучение/статистика, если только я не неправильно понимаю, о каком типе «цепочки» вы говорите.

Ответ №1:

Это больше похоже на networkx проблему

 import networkx as nx 
G = nx.Graph()
G.add_edges_from(input_list)
l = [*nx.connected_components(G)]
Out[6]: [{'A', 'B', 'C', 'D', 'E'}, {'I', 'J', 'K', 'L'}]
 

Ответ №2:

Воспользуйся

output_list = set(input_list)

затем сформируйте необходимый шаблон цепочки, используя кортежи, такие как:

 from string import ascii_uppercase

input_list  = [('A','B'),('D','C'),('C','B'),
    ('E','D'),('I','J'),('L','K'),('J','K')]

src=sorted({e for t in input_list for e in t})
ss=""
tgt=[]

for c in src:
    if ss c in ascii_uppercase:
        ss =c
    else:
        tgt.append(tuple(ss))
        ss=c
else:
    tgt.append(tuple(ss))

>>> tgt
[('A', 'B', 'C', 'D', 'E'), ('I', 'J', 'K', 'L')]