你可以使用字典和str.format:
atr = 'age'
c = 30
g.vs(**{'{}_lt'.format(atr): c}
如果您擔心內存的你也可以使用一個創記錄:
(v for v in g.vs if v[atr] < c)
都返回相同的輸出:
In [2]: g = Graph([(0,1), (0,2), (2,3), (3,4), (4,2), (2,5), (5,0), (6,3), (5,6)])
In [3]: g.vs["name"] = ["Alice", "Bob", "Claire", "Dennis", "Esther", "Frank", "George"]
In [4]: g.vs["age"] = [25, 31, 18, 47, 22, 23, 50]
In [5]: g.vs["gender"] = ["f", "m", "f", "m", "f", "m", "m"]
In [6]: g.es["is_formal"] = [False, False, True, True, True, False, True, False, False]
In [7]: atr = 'age'
In [8]: c = 30
In [9]: list(g.vs(**{'{}_lt'.format(atr): c}))
Out[9]:
[igraph.Vertex(<igraph.Graph object at 0x7f06ae24f810>,0,{'gender': 'f', 'age': 25, 'name': 'Alice'}),
igraph.Vertex(<igraph.Graph object at 0x7f06ae24f810>,2,{'gender': 'f', 'age': 18, 'name': 'Claire'}),
igraph.Vertex(<igraph.Graph object at 0x7f06ae24f810>,4,{'gender': 'f', 'age': 22, 'name': 'Esther'}),
igraph.Vertex(<igraph.Graph object at 0x7f06ae24f810>,5,{'gender': 'm', 'age': 23, 'name': 'Frank'})]
In [10]: list(v for v in g.vs if v[atr] < c)
Out[10]:
[igraph.Vertex(<igraph.Graph object at 0x7f06ae24f810>,0,{'gender': 'f', 'age': 25, 'name': 'Alice'}),
igraph.Vertex(<igraph.Graph object at 0x7f06ae24f810>,2,{'gender': 'f', 'age': 18, 'name': 'Claire'}),
igraph.Vertex(<igraph.Graph object at 0x7f06ae24f810>,4,{'gender': 'f', 'age': 22, 'name': 'Esther'}),
igraph.Vertex(<igraph.Graph object at 0x7f06ae24f810>,5,{'gender': 'm', 'age': 23, 'name': 'Frank'})]
你不會在所有的len等等,但它似乎非常有效,如果你只是想過濾元素:
In [14]: timeit list(v for v in g.vs if v[atr] < c)
100000 loops, best of 3: 4.7 µs per loop
In [15]: timeit list(g.vs(**{'{}_lt'.format(atr): c}))
100000 loops, best of 3: 14.5 µs per loop
這兩個答案都很有幫助,但我會將此標記爲提及速度方面和作爲第一個答案的答案。 – Sait