从python中的列表/序列创建动态子列表

时间:2012-05-16 05:02:21

标签: python

我正在尝试编写一个函数来创建一组动态子列表,每个子列表包含传递给它的列表中的5个元素。这是我对代码的尝试

def sublists(seq):
    i=0
    x=[]
    while i<len(seq)-1:
        j=0
        while j<5:
            X.append(seq[i]) # How do I change X after it reaches size 5?
     #return set of sublists

编辑:

示例输入:[1,2,3,4,5,6,7,8,9,10]

预期输出:[[1,2,3,4,5],[6,7,8,9,10]]

3 个答案:

答案 0 :(得分:3)

嗯,对于初学者来说,你需要(或者至少应该)有两个列表,一个是临时的,一个是永久的一个(你也需要增加j和i,或者更实际的是,使用一个for loop,但我想你只是忘了张贴那个)。

EDIT 删除了第一个代码,因为给定的样式与预期结果不匹配,请参阅其他两种可能性。

或者,更明智地说:

def sublists(seq):
    x=[]
    for i in range(0,len(seq),5):
        x.append(seq[i:i+5])
    return x

或者,更明智的是,一个简单的列表理解:

def sublists(seq):
    return [seq[i:i+5] for i in range(0,len(seq),5)]

给出列表时:

l = [1,2,3,4,5,6,7,8,9,10]

他们将返回

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

答案 1 :(得分:0)

通过“动态子列表”,您的意思是将列表分成五个元素组吗?这与您的方法类似:

def sublists(lst, n):
    ret = []
    i = 0
    while i < len(lst):
        ret.append(seq[i:i+n])
        i += n
    return ret

或者,使用迭代器:

def sublists(seq, n):
    it = iter(seq)
    while True:
        r = list(itertools.islice(it, 5))
        if not r:
            break
        yield r

将返回列表的迭代器,列表长度最多为5。 (如果您取消list调用,如果您没有以相同的顺序访问迭代器,则会发生奇怪的事情。)

答案 2 :(得分:0)

您是否考虑过使用itertools.combinations(...)

例如:

>>> from itertools import combinations
>>> l = [1,2,3,4,5,6]
>>> list(combinations(l, 5))
[(1, 2, 3, 4, 5), (1, 2, 3, 4, 6), (1, 2, 3, 5, 6), (1, 2, 4, 5, 6), (1, 3, 4, 5, 6), (2, 3, 4, 5, 6)]