2013-01-23 16 views
4

的n-gram我可以做一个快速和肮脏的二元序列,像这样:列表的拉链

>>> w = ['a', 'b', 'c', 'd'] 
>>> zip(w, w[1:]) 
[('a', 'b'), ('b', 'c'), ('c', 'd')] 

我想打一个接受数值参数的函数,正,正克。我如何接受这个论点并自动填写上面显示的zip参数?换句话说,我的功能:

>>> make_ngrams(w, 3) 

将动态创建

>>> zip(w, w[1:], w[2:]) 

,并返回:

[('a', 'b', 'c'), ('b', 'c', 'd')] 

灿星运营商(S)帮助(S)我这里?感谢您的任何见解!

+2

Metaprogramming? –

回答

10
def make_ngrams(lst, n): 
    return zip(*(lst[i:] for i in xrange(n))) 

*操作者基本上采用一个可迭代的所有元素并将它们作为独立参数进功能。

+0

+1击败了我。 –

+0

Gaaaah :)我知道*操作符可以做到这一点!我认为我必须完成这一天。非常感谢@Volatility!将尽快接受。 – verbsintransit

+0

狡猾的解决方案(+1),但是对于大型'lst'和小型'n'而言空间非常低效 – inspectorG4dget