2015-04-16 4 views
0

Я пытался разработать структуру графа, которая будет связывать объекты в соответствии с упомянутыми выше функциями между ними, например. 2 места связаны, если они упомянуты в статье.Population Networkx Graph с информацией итеративно

Мне это удалось, но у меня возникли проблемы с итеративным заполнением края новой информацией, содержащей уже существующую.

Мой подход (так как я нигде не нашел ничего связанного) заключается в том, чтобы добавить существующую информацию в список, добавить новую ссылку в список и назначить этот список соответствующей функции.

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[:] 

Как вы можете видеть выше, так как должны быть заселенно, я определил специальный список (TEMP), погрузил старое содержимое переменной называется статья ссылки (если ссылка не существует создать много ссылок ссылку и добавьте в качестве первого значения URL-адрес, который «привел» 2 места вместе.

. Моя проблема заключается в том, что я каждый раз опорожняю список, чтобы быть пустым, когда приходит новая пара, когда я пытаюсь увидеть ссылку url Я получаю что-то вроде этого:

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

Кажется, что я ke eping только последняя ссылка, поскольку каждый раз, когда я удаляю содержимое временного списка, но я не могу найти лучший способ сделать это, не объявляя ненужную группу списков temp.

Любые идеи?

Спасибо за ваше время.

ответ

1

TL/резюме DR: изменить весь фрагмент кода в

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]) 

Вот что происходит:

При создании Кромка первый раз, когда вы используете

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

Так это строка. Но позже, когда вы делаете

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

вы определили temp быть список, первый элемент которого G[i[z]][i[j]]['article']. Таким образом, G[i[z]][i[j]]['article'] теперь представляет собой список с двумя элементами, первым из которых является старое значение для G[i[z]][i[j]]['article'] (строка), а вторым из них является новый url (также строка).

Вашей проблема возникает на более поздних этапах:

С тех пор, это точно то же самое. G[i[z]][i[j]]['article'] - это снова список с двумя элементами, первым из которых является его старое значение (список), а второй - новый url (строка). Итак, у вас есть вложенный список.

давайте проследим через три URLs: 'a', 'b' и 'c', и я буду использовать E для сокращайте G[i[z]][i[j]]. Первый раз, вы получаете E='a'. Второй раз вы получаете E=['a', 'b']. Третий раз через это дает E=[['a','b'],'c']. Поэтому он всегда делает E[0] прежним значением E, а E[1] - это новый URL-адрес.

Два варианта:

1) Вы можете обрабатывать создание temp по-разному, если у вас есть строка или список. Это плохой выбор.

2) Лучше: Составьте список все время, а затем даже не имеете дело с temp. Попробуйте создать край как (...,article = [url]), а затем просто используйте G[i[z]][i[j]]['article'].append(url) вместо определения temp.

Так что ваш код будет

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]) 

Отдельная вещь, которая может также вызвать проблемы, это вызов

del temp[:] 

Это должно вызвать поведение, отличное от того, что я думаю, что вы описания. Поэтому я думаю, что это немного отличается от того, как он на самом деле закодирован. Когда вы установите G[i[z]][i[j]] = temp, а затем выполните del temp[:], вы сделали два списка одним списком с двумя разными именами. Когда вы del temp[:], вы также делаете это до G[i[z]][i[j]]. Рассмотрим следующий

temp = [] 
temp.append(1) 
print temp 
> [1]  
L = temp 
print L 
> [1] 
del temp[:] 
print L 
> [] 
+0

Спасибо за ответ. Я сейчас попробую ваш предлагаемый способ и дам вам знать, но моя кишка говорит, что первой проблемой, которую мне нужно решить, является del temp [:]. Я думал, что было разрешено использовать список в качестве подстановочного знака и добавлять информацию к ссылкам графика. – Swan87

+0

Если вы используете то, что я предложил, темп вам даже не понадобится. – Joel

0

Я думаю, что все ваши предыдущие URL-адреса находятся в вашем новом списке. Они в [...].

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

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

Вы получите:

[[1, 2, 3], 4] 

Но если вы делаете:

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

Вы получаете:

[1, 2, 3, 4] 
+0

Я не думаю, что это так, поскольку, когда я пытаюсь получить все URLs конкретного края я получаю: [[...], u'http: //www.huffingtonpost .co.uk /.../ '] снова. Если я буду использовать расширение при добавлении URL-адреса, как вы предложили, он вернет ['h', 't', 't', 'p' ...] вместо ['http: // www ...'] – Swan87

+0

Что если вы делаете G [i [z]] [i [j]] ['article']. append (url [index]) вместо создания временного списка? – TheWalkingCube

+0

Я попробовал это, чтобы убедиться, но, как я подозревал: AttributeError: объект «unicode» не имеет атрибута «добавить». – Swan87

 Смежные вопросы

  • Нет связанных вопросов^_^