我正在尝试按照我在 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 和迭代器经验将它们组合成一个函数。
我想出的解决方案是这样的:
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”方式来做呢?