Я могу сделать быструю и грязную последовательность биграмм, например, так:

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

Я хочу сделать функцию, которая принимает числовой аргумент, n, из n-граммы. Как мне взять этот аргумент и автоматически заполнить zip-аргументы, как показано выше? Другими словами, моя функция:

>>> make_ngrams(w, 3)

Будет создавать

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

На лету и возвращаемся:

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

Могут ли звездные операторы помочь мне здесь? Спасибо за понимание!

4
verbsintransit 23 Янв 2013 в 10:07

2 ответа

Лучший ответ
def make_ngrams(lst, n):
    return zip(*(lst[i:] for i in xrange(n)))

Оператор * в основном берет все элементы итерируемого и передает их как отдельные аргументы в функцию.

10
Volatility 23 Янв 2013 в 06:24
def ngram(L, n):
    return [tuple(L[i:i+n]) for i in xrange(len(L)-n+1)]
2
inspectorG4dget 23 Янв 2013 в 06:23