2013-01-24 12 views
0

我想概括一下我在Github上的Gist中发现的TextRank算法的图形实现。将滑动窗口与Python中的成对枚举相结合

基本上它是一个图形问题,您需要在大小为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 

这给了我,我想,排序不是真的是必要的结果,但有这样做的更优雅的“Python化”的方式?

回答

0

实际上,恕我直言,你有什么不坏,是相当可读的。我可以在当前的运行将是办法改变intermediate_list与看到的唯一的改善是一个generator expression对象,而不是实际的list

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

您可能还希望更改其名称,以便更好地反映它会那么可以说,像pair_generatorgen_pairs

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

+0

感谢您的评论,我会根据您的建议将其切换到生成器。我想我的担心是中间步骤生成重复,然后使用列表(set(..))删除重复。我已经看到它在很多地方建议,为了删除列表中的重复项,您可以简单地切换到设置,然后返回列表,但不知何故,这让我有点不安。在其他语言中,您可以轻松地在类型之间来回切换。 – nsecord

+0

那么,从序列切换到类似集合或字典的东西时,项目顺序会丢失 - 因此会有一些信息丢失,但这似乎并不是一个问题。还有其他方法可以删除重复项 - 我相信这是在该步骤中使用集合的目的 - 但如果排序不是问题,则使用集合是最好的方法之一。 – martineau