在python中获取子列表的更好方法

时间:2015-10-27 02:16:19

标签: python

我正在解决以下问题: 此函数返回L长度为n的所有可能子列表的列表,而不跳过L中的元素。返回列表中的子列表应按它们在L中出现的方式排序,这些子列表从较小的索引开始位于前面清单。

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]]

5 个答案:

答案 0 :(得分: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 :(得分: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]]

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我完成了对读者更好理解的程序。

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]]

答案 4 :(得分:0)

我认为,理解这个概念非常易读。这里的想法是迭代从0到L的长度减去4的数字。然后从当前索引i中取L的子列表到i + 4。迭代到长度为4可确保您不会尝试访问超出范围的索引!

String type;
int num;
Date date;