2015-10-27 3 views
0

Я работаю над следующей проблемой: Эта функция возвращает список всех возможных подписок в L длины n без пропусков элементов в L. Подсети в возвращаемом списке должны быть упорядочены в как они появляются в L, причем эти подсписки начинаются с меньшего индекса, находящегося в начале списка.Лучший способ получить подсписку в python

Example 1, if L = [10, 4, 6, 8, 3, 4, 5, 7, 7, 2] and n = 4 тогда ваша функция должна вернуть список [[10, 4, 6, 8], [4, 6, 8, 3], [6, 8, 3, 4], [8, 3, 4, 5], [3, 4, 5, 7], [4, 5, 7, 7], [5, 7, 7, 2]]

мое решение работает, но как я могу сделать его короче? Что это лучший способ сделать это?

def getSublists(L, n): 

    newN = n 
    myList = [] 
    for i in range(len(L)): 
     orginalLen = L[i:n] 
     if(len(orginalLen) == n): 
      myList.append(L[i:n]) 
      n = n + 1 
     else: 
      myList.append(L[i:n]) 
      n = n + 1 
    if(newN == 1): 
     print(myList) 
    else: 
     print(myList[:len(myList)-(n-1)]) 
getSublists([10, 4, 6, 8, 3, 4, 5, 7, 7, 2],4) 

getSublists([1], 1) 

getSublists([0, 0, 0, 0, 0], 2) 



OUTPUT 
[[10, 4, 6, 8], [4, 6, 8, 3], [6, 8, 3, 4], [8, 3, 4, 5], [3, 4, 5, 7], [4, 5, 7, 7], [5, 7, 7, 2]] 
[[1]] 
[[0, 0], [0, 0], [0, 0], [0, 0]] 
+1

Почему у вас есть, что первый если-то еще? Вы делаете то же самое в обеих ветвях. – user2357112

+0

Честно говоря, это единственный способ заставить его работать. Разница заключается в длинах. – Maddy

ответ

2
l = [1,2,3,4,5,6,87,9] 
n = .. 
print [l[i:i+n] for i in range(len(l)-n+1)] 

может быть, что вам нужно.

1
def get_sublists(L, n): 
    return [ L[i:i+n] for i in range(len(L)-n) ] 
0

Это очень читаемо, я думаю, чтобы понять концепцию. Идея здесь состоит в том, чтобы перебирать числа от 0 до длины L, минус 4. И просто возьмите подсписку L от вашего текущего индекса i, до i + 4. Итерирование до длины-4 гарантирует, что вы не пытаетесь получить доступ к индексу за пределы!

>>> for i in range(len(L)-4+1): 
      print L[i:i+4] 

    [10, 4, 6, 8] 
    [4, 6, 8, 3] 
    [6, 8, 3, 4] 
    [8, 3, 4, 5] 
    [3, 4, 5, 7] 
    [4, 5, 7, 7] 
    [5, 7, 7, 2] 
2

В одной строке:

get_sublists = lambda ls, n: [ls[x:x+n] for x in range(len(ls)-n+1)] 


get_sublists([10, 4, 6, 8, 3, 4, 5, 7, 7, 2], 4)

[[10, 4, 6, 8], [4, 6, 8, 3], [6 , 8, 3, 4], [8, 3, 4, 5], [3, 4, 5, 7], [4, 5, 7, 7], [5, 7, 7, 2]]

1

Я закончил p немного лучше понять читателя.

def getSublists(L, n): 
    new_list = [] 
    for i in range(len(L)-n+1): 
      a = L[i:i+n] 
      new_list.append(a) 
    return new_list 

Ответ:

[[10, 4, 6, 8], 
[4, 6, 8, 3], 
[6, 8, 3, 4], 
[8, 3, 4, 5], 
[3, 4, 5, 7], 
[4, 5, 7, 7], 
[5, 7, 7, 2]]