我正在尝试编写一个函数来创建一组动态子列表,每个子列表包含传递给它的列表中的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]]
答案 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)]