2013-01-23 15 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