Preenchendo NetworkX Gráfico com a informação de forma iterativa

votos
0

Eu tenho tentado desenvolver uma estrutura gráfico que vai ligar as entidades de acordo com características co-mencionado entre eles, por exemplo, 2 lugares estão ligados se co-mencionado em um artigo.

Eu consegui fazer isso, mas eu tenho tido problemas para preencher de forma iterativa uma vantagem com novas informações mantendo a um já existente.

Minha abordagem (uma vez que eu não encontrei nada relacionado em qualquer lugar) é para anexar a informação existente a uma lista, acrescentar a nova ligação na lista e atribuir essa lista para o recurso apropriado.

    temp = []
    if G.has_edge(i[z],i[j]):
        temp.append(G[i[z]][i[j]]['article'])
        temp.append(url[index])
        G[i[z]][i[j]]['article'] = temp
    else:
        print Create edge!
        G.add_edge(i[z],i[j], article=url)
    del temp[:]

Como você pode ver acima, uma vez que existem muitas ligações a ser povoadas, eu definiu uma lista dedicada (temp), carregado as antigas conteúdo da variável chamado artigo de um link (se o link não existe para criar um link e adicione como o primeiro valor a url que trouxe 2 lugares juntos.

Meu problema é que, enquanto eu esvaziar a lista de cada vez, a fim de estar vazio quando um novo par vem em quando eu tento ver urls de uma ligação que recebo algo como isto:

{'article': [[...], u'http://www.huffingtonpost.co.uk/.../']

Parece que eu estou mantendo apenas o último elo de cada vez que eu apagar o conteúdo da lista temporária, mas não consigo encontrar uma maneira melhor de fazê-lo sem declarar um bando desnecessária de listas de trabalho temporário.

Alguma ideia?

Obrigado pelo seu tempo.

Publicado 16/04/2015 em 13:52
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Eu acho que todos os seus URLs anteriores estão em sua nova lista. Eles estão no [...].

Você deve usar aumentar em vez de acrescentar quando você começa a lista existente a partir da borda.

temp = []
temp.append([1, 2, 3])
temp.append(1)
print(temp)

Você vai ter:

[[1, 2, 3], 4]

Mas se você faz:

temp = []
temp.extend([1, 2, 3])
temp.append(4)
print(temp)

Você recebe:

[1, 2, 3, 4]
Respondeu 16/04/2015 em 14:11
fonte usuário

votos
1

resumo TL / DR: mudar todo o seu trecho de

if G.has_edge(i[z],i[j]):
        G[i[z]][i[j]]['article'].append(url[index])
    else:
        G.add_edge(i[z],i[j], article=[url])

Aqui está o que está acontecendo:

Quando você cria a borda a primeira vez que você usar

G.add_edge(i[z],i[j], article=url)

Portanto, é uma string. Mas mais tarde, quando você faz

G[i[z]][i[j]]['article'] = temp

você definiu temppara ser uma lista cujo primeiro elemento é G[i[z]][i[j]]['article']. Então, G[i[z]][i[j]]['article']agora é uma lista com dois elementos, o primeiro dos quais é o valor antigo para G[i[z]][i[j]]['article'](uma string) e o segundo dos quais é o novo url (também uma string).

Seu problema surge nas etapas posteriores:

A partir de então, é exatamente a mesma coisa. G[i[z]][i[j]]['article']é novamente uma lista com dois elementos, o primeiro dos quais é o seu valor antigo (uma lista) eo segundo é o novo url (a string). Então você tem uma lista aninhada.

vamos rastrear através de três urls: 'a', 'b'e 'c', e eu vou usar Epara abreviar G[i[z]][i[j]]. Primeira vez através, você começa E='a'. Segunda vez através de você chegar E=['a', 'b']. Terceira vez através dele dá E=[['a','b'],'c']. Por isso é sempre fazer E[0]para ser o valor anterior de E, e E[1]para ser o novo url.

Duas opções:

1) você pode lidar com a criação de tempmaneira diferente se você tem uma corda ou uma lista. Esta é a má escolha.

2) Melhor: Faça-lhe uma lista de todo o tempo através de e, em seguida, nem sequer lidar com temp. Tente criar a borda como (...,article = [url])e, em seguida, é só usar G[i[z]][i[j]]['article'].append(url)em vez de definir temp.

Portanto, o seu código seria

if G.has_edge(i[z],i[j]):
        G[i[z]][i[j]]['article'].append(url[index])
    else:
        G.add_edge(i[z],i[j], article=[url])

Uma coisa separada, que também pode causar problemas é a chamada

del temp[:]

Isso deve causar um comportamento diferente do que eu acho que você está descrevendo. Então eu acho que isso é um pouco diferente de como ele é realmente codificada. Quando você definir G[i[z]][i[j]] = tempe, em seguida, fazer del temp[:], você fez as duas listas para ser uma lista com dois nomes diferentes. Quando del temp[:]você também está fazendo isso para G[i[z]][i[j]]. Considere o seguinte

temp = []
temp.append(1)
print temp
> [1]    
L = temp
print L
> [1]
del temp[:]
print L
> []
Respondeu 17/04/2015 em 00:02
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more