2015-03-29 3 views
6

Я работаю с набором данных электронной почты электронной почты, и я пытаюсь удалить адреса электронной почты, которые не имеют «@ enron.com» (т. Е. Я хотел бы иметь только электронные письма). Когда я попытался удалить эти адреса без @ enron.com, некоторые письма просто пропустили по некоторым причинам. Ниже показан небольшой график, где вершины - адрес электронной почты. Это формат GML:Python igraph: удалить вершины из графика

Creator "igraph version 0.7 Sun Mar 29 20:15:45 2015" 
Version 1 
graph 
[ 
    directed 1 
    node 
    [ 
    id 0 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 1 
    label "steve_will[email protected]" 
    ] 
    node 
    [ 
    id 2 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 3 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 4 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 5 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 6 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 7 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 8 
    label "[email protected]" 
    ] 
    node 
    [ 
    id 9 
    label "[email protected]" 
    ] 
    edge 
    [ 
    source 5 
    target 5 
    weight 1 
    ] 
] 

Мой код:

G = ig.read("enron_email_filtered.gml") 
for v in G.vs: 
    print v['label'] 
    if '@enron.com' not in v['label']: 
     G.delete_vertices(v.index) 
     print 'Deleted' 

В этом наборе, 7 письма должны быть удалены. Однако, исходя из вышеуказанного кода, удаляется только 5 электронных писем.

+1

I не думайте, что вам разрешено удалять вершины, когда вы перебираете «G.vs». Попробуйте собрать их, а затем удалить их все сразу. –

+0

Правильно - модификации набора вершин при итерации над «G.vs» дают непредсказуемые результаты. –

ответ

5

Из учебника here, вы можете получить доступ все вершины с определенным свойством, а затем удалить их следующим образом:

to_delete_ids = [v.index for v in G.vs if '@enron.com' not in v['label']] 
G.delete_vertices(to_delete_ids) 

Вот результат я получил:

to delete ids: [1, 3, 4, 5, 7, 8, 9] 
Before deletion: IGRAPH D-W- 10 1 -- 
+ attr: id (v), label (v), weight (e) 
+ edges: 
5->5 
After deletion: IGRAPH D-W- 3 0 -- 
+ attr: id (v), label (v), weight (e) 
label: [email protected] 
label: [email protected] 
label: [email protected] 
+2

У меня есть аналогичная проблема, но я хочу удалить вершины, у которых нет ребер. Что-то вроде 'to delete_ids = [v.index для v в g_groups_all.vs, если v НЕ НРАВИТСЯ EDGES]' Любые идеи? @ Джей @ Брайан Томпсетт? –

+2

@B_Furtado использовать g.vs.find (_degree = 0). –