在Python中将滑动窗口与对枚举相结合

时间:2013-01-24 16:50:36

标签: python window iteration tuples

我试图按照我在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”方式吗?

1 个答案:

答案 0 :(得分:0)

实际上恕我直言,你所拥有的并不坏,而且相当可读。我目前使用的方式可以看到的唯一改进是将intermediate_list更改为generator expression对象而不是实际的list

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

您可能还想更改其名称,以便更好地反映它,例如pair_generatorgen_pairs

顺便说一句,它超越了“Pythonic”,以避免prematurely optimizing事情(当然,除非你只是为了好玩而这样做)。