1

目前我正在以这种方式从networkx's模块填充生成器:MultiDiGraph

new_u0_edges = ((u, new_u1, key, edata) for u, v, key, edata in
                self.g.edges_iter(u0, data=True,
                keys=True) if v == path[0])

但我也想更新字典key, value中的一对,特别是. 使用列表而不是生成器执行此操作的缓慢方法是:edataedata['label']

new_u0_edges = ((u, new_u1, key, edata) for u, v, key, edata in
                self.g.edges_iter(u0, data=True,
                keys=True) if v == path[0])
for u, new_u1, key, edata in new_u0_edges:
    edata['label'] = u0[0] + new_u1`

仅供参考,u0并且new_u1都是字符串。是的,如果您有兴趣,这是一个 deBruijn 图。

我的问题是:有没有办法edata在生成器中修改这个字典? dict.update([iterable])不返回生成器所需的值,并且列表推导似乎不允许重新分配。

谢谢!

更新:一些示例变量数据(仍在测试,所以看起来很傻):

u0 = 'DEFGHIJ'
new_u1 = 'EFGHIJKLMNabcdefghiwxyz012345'
key = 'rna'
edata = {'color': '#E41A1C', 'seq_type': 'rna', 'fontcolor': '#E41A1C', 'weight': 1, 'label': 'DEFGHIJK (nreads=1)'}
4

2 回答 2

2

您可以编写一个函数来为您进行处理,然后调用它以从生成器生成每个元素。您还可以利用yield编写自己的生成器函数,而不是将其塞进生成器语句中。

于 2013-05-14T16:44:13.330 回答
0

((u, new_u1, key, edata) for u, v, key, edata in self.g.edges_iter(u0, data=True, keys=True) if v == path[0] and not edata.update({'label':u0[0]+new_u1}) )

我认为会工作......虽然它很恶心

于 2013-05-14T16:39:49.753 回答