1

networkx現在、次のように、の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ペア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 グラフです。

私の質問は:ジェネレーターでこの dictを変更する方法はありますか? 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 に答える