2015-04-27 2 views
-2

Я пытаюсь сделать функцию перекрытия в питоне, который принимает любую итерацию, ИНТ п, а ИНТ м (чье значение по умолчанию равно 1), как параметры, и производить листы п значений:внахлест итерируемых с заданным п и т без LEN() использовать

  1. Первый список содержит первые п значения;
  2. Каждый последующий список капель первый м из предыдущего списка
  3. Добавляет следующий м значения из итератора, пока не меньше, чем п значения для занесения в возвращаемом списке.

Пример:

for i in overlap('abcdefghijk',4,2): 
    print(i,end=' ') 

Его выход ['a','b','c','d'], ['c','d','e','f'], ['e','f','g','h'] и ['g','h',i','j'] для n=4 и m=2. В этом случае, если функция выглядит примерно так:

def overlap(iterable, n, m=1) 

Как это можно сделать? Основная проблема, с которой я столкнулся, заключается в том, как остановиться, когда есть меньше n значений.

Текущий код: кредиты anmol_uppal's solution.

def hide(iterable): 
    for v in iterable: 
     yield v 

def overlap(word, n, m): 
    start = 0 
    while(start+n < len(word)): 
     yield list(word[start:start+n]) 
     start += m 

if __name__ == '__main__': 
    for i in overlap('abcdefghijk',3,2): 
     print(i, end=' ') 
    print() 
    for i in overlap(hide('abcdefghijk'),3,2): 
     print(i, end=' ') 
    print() 

Но проблема в том, что мы не можем использовать len() с генераторами.

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

def hide(iterable): 
    for v in iterable: 
     yield v 

def window(seq, size, step=1): 
    iters = [iter(seq) for i in range(size)] 
    [next(iters[i]) for j in range(size) for i in range(-1, -j-1, -1)] 
    while(True): 
     yield [next(i) for i in iters] 
     [next(i) for i in iters for j in range(step-1)] 

if __name__ == '__main__': 
    for i in window('abcdefghijk', 3, 2): 
     print(i, end=' ') 
    print() 
    for i in window(hide('abcdefghijk'), 3, 2): 
     print(i, end=' ') 
    print() 
+0

@jonrsharpe Пожалуйста, проверьте наличие проблемы. Его не дублируют – Hacker688

+0

@Steven Rumbalski Удалите повторяющийся тег, поскольку проблема не дублируется. – Hacker688

+0

Почему вы используете 'hide()' его ничего особенного? – ZdaR

ответ

1
def overlap(word, n,m): 
    ans = [] 
    start = 0 
    while(start+n<len(word)): 
     ans.append(list(word[start:start+n])) 
     start+=m 

    return ans 


>>> print overlap("abcdefghijk", 4, 2) 
>>> [['a', 'b', 'c', 'd'], ['c', 'd', 'e', 'f'], ['e', 'f', 'g', 'h'], ['g', 'h', 'i', 'j']] 
>>> print overlap("abcdefghi", 4, 2) 
>>> [['a', 'b', 'c', 'd'], ['c', 'd', 'e', 'f'], ['e', 'f', 'g', 'h']] 

Кроме того, если вы хотите, чтобы получить результаты, а не возвращать их, то вы можете использовать следующую простую версию:

def overlap(word, n,m): 
    start = 0 
    while(start+n<len(word)): 
     yield list(word[start:start+n]) 
     start+=m 

for i in overlap("abcdefghijk", 4, 2): 
    print (i,end = " ") 

чтобы заставить его работать с функцией hide() вам нужно преобразовать его в строку первой, так:

for i in overlap("".join(hide("abcdefghijk")),3, 2): 
    print i 
+0

Мне нужно дать результат, чтобы я мог сделать для i в перекрытии ('abcdefghijk', 4,2): print (i, end = '') – Hacker688

+0

Вы получаете его? – Hacker688

+0

Да, я собираюсь отредактировать ответ, увидев, что он вам подходит. – ZdaR

 Смежные вопросы

  • Нет связанных вопросов^_^