2012-05-16 67 views
0

我试着去编写创建集动态子列表的功能,从传递给it.Here是我尝试在代码创建从列表/序列动态子列表在Python

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 

编辑列表中的每个包含5种元素:

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

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

+1

您不清楚您期望的输出。请给我们例子。 – San4ez

+0

@ San4ez:增加了一个例子! – KodeSeeker

+0

然后它是http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python – San4ez

回答

3

嗯,首先,你需要(或者至少应该)有两个列表,您返回一个临时和永久的一个(你也将需要增加j和i,或者更实际上,使用for循环,但我认为你只是忘了发布)。

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

或者,更理智:

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

:很好的答案!我真的很想你的第二个解释,谢谢! – KodeSeeker

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 

将返回列表的迭代器来的最大长度为五强之列。 (如果您拨打list电话,如果您不以相同顺序访问迭代器,会发生奇怪的事情。)

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)] 
+0

没有帮助解决我的问题,请看编辑的问题! – KodeSeeker

+0

@KodeSeeker我的歉意,我误解了你的问题的意图。 – srgerg