0

GithubのこのGistで見つけたものに従って、TextRankアルゴリズムのグラフ実装を一般化しようとしています。

基本的には、サイズnのスライディングウィンドウ内のノードのすべてのペアの間にエッジを作成する必要があるグラフの問題です。たとえば、ノードのリストがある場合

nodes=[0,1,2,3,4,5,6] 

ウィンドウサイズがn=3の場合、エッジのセットを列挙したいと思います

edges=[(0,1), (0,2), (1,2), (1,3), (2,3), (2,4), (3,4), (3,5), ..., (5,6)]

スライドウィンドウ(例:#6998245#6822725)とペアの列挙(例:#1257413 13014595)について多くの質問を見てきましたが、残念ながら、Pythonとイテレーターについて十分な経験がありません。それらを1つの関数に結合します。

私が思いついた解決策はこれです:

from itertools import islice, combinations, chain

def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result    
    for elem in it:
       result = result[1:] + (elem,)
       yield result

nodes = [0,1,2,3,4,5,6]

windowed = window(nodes,3)
intermediate_list = [combinations(item,2) for item in windowed]
edges = list(set(chain.from_iterable(intermediate_list)))
edges = sorted(edges)

print edges

これにより、私が望む結果が得られます。並べ替えは実​​際には必要ありませんが、よりエレガントな「pythonic」の方法はありますか?

4

1 に答える 1

0

実際、私見はあなたが持っているものは悪くなく、かなり読みやすいです。現在の動作方法で確認できる唯一の改善点は、を実際のオブジェクトではなくジェネレータ式intermediate_listオブジェクトに変更することです。list

intermediate_list = (combinations(item,2) for item in windowed) # outer parentheses required

また、名前を変更して、より適切に反映することもできます。たとえば、pair_generatorまたはのようになりgen_pairsます。

ところで、時期尚早に物事を最適化することを避けるために、それは「Pythonic」を超えています(もちろん、あなたがただ楽しみのためにそれをしているのでない限り)。

于 2013-01-24T20:37:14.220 に答える