2013-05-14 91 views
1

目前我填充从networkxMultiDiGraph模块发电机更换单个值,以这样的方式在字典中的Python列表理解与其他项目

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对在edata字典中,具体为edata['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` 

仅供参考,u0new_u1都是字符串。是的,如果你有兴趣,这是一个deBruijn图。

我的问题是:有没有办法在发生器中修改这个edata字典?dict.update([iterable])没有为生成器返回必要的值,列表解析似乎不允许重新分配。

谢谢!

更新:一些示例可变数据(仍在测试所以它的傻傻的看着):

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

为什么它必须是列表理解?您正在更新列表中的可变值,**不生成*新*列表。 – 2013-05-14 16:37:36

+0

对于那些用科学术语来说是困难的人来说,张贴可变数据会很好,所以凡人可以看看它:) – Torxed 2013-05-14 16:40:06

+0

最后的目标是将这些新的边缘添加到网络并删除旧的,所以我想我*我正在创建一个新列表。我想使用一个列表理解生成器,因为我可能会有许多新的边缘添加到'MultiDiGraph' self.g'中,并且'MultiDiGraph.add_edges_from'使用迭代器更快。 – 2013-05-14 16:41:19

回答

2

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

+0

谢谢@ sr2222!这可能是最Pythonic的方式,当然也是最可读的。 – 2013-05-14 16:49:17

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

我想会的工作......但其漂亮的毛

相关问题