2015-10-01 54 views
3

如果我有这样的列表:拆开一个列表的Python

X = [0, 2, 3, 4.0, 1, 0, 3, 0, 0, 0, 2, 1, 5, 2, 6, 0, 2.2, 1] 

我将如何编写代码在Python这需要这个名单,并认为连续的正数数,然后使具有的名单列表其中的每个连续数字。

例如x的这个例子会返回一个4号 ,它也将返回:

[[ 2, 3, 4.0, 1], [3], [ 2, 1, 5, 2, 6], [ 2.2, 1]]. 

我写这篇找到所有的零,但我不知道从哪里里去:

zeros = [] 
for i in range(0,len(World)): 
     if z[i]==0: 
      zeros.append(i) 
+1

你能解释一下你想要做的更详细的吗? – khelwood

+0

我想写一个函数,在其中输入一个列表,然后返回连续数字出现在该列表中的次数,然后返回一个包含这些数字列表的列表。 – Laura

+3

@Laura pro-tip:当有人要求更多细节时,不要只用略微不同的顺序来使用相同的单词! – jonrsharpe

回答

2

你不需要事先找出零的指数。您可以简单地保留另一个临时列表,其中包含自上次遇到0以来的正值(大于0)的值。然后,当您遇到0时,将该临时列表追加到结果列表中,并将该临时列表更改为新列表。示例 -

result = [] 
temp = [] 
for i in X: 
    if i <= 0: 
     if temp: 
      result.append(temp) 
      temp = [] 
    else: 
     temp.append(i) 
if temp: 
    result.append(temp) 

演示 -

>>> result = [] 
>>> temp = [] 
>>> for i in X: 
...  if i <= 0: 
...   if temp: 
...    result.append(temp) 
...    temp = [] 
...  else: 
...   temp.append(i) 
... 
>>> if temp: 
...  result.append(temp) 
... 
>>> result 
[[2, 3, 4.0, 1], [3], [2, 1, 5, 2, 6], [2.2, 1]] 
7

没有必要细零点。你可以简单地遍历列表,把正数的临时列表,直到您零遇到的,但是对于这样的任务更Python的方法,您可以使用itertools.groupby

>>> from itertools import groupby 
>>> [list(g) for k,g in groupby(X,key=lambda x:x>0) if k] 
[[2, 3, 4.0, 1], [3], [2, 1, 5, 2, 6], [2.2, 1]] 

如果你想这样做没有itertools模块,您可以使用以下函数,它基于前面的解释工作,并在每次遇到零时产生临时列表,最后返回一个包含正数的列表,您可以通过调用list函数将其转换为列表:

>>> def grouper(li,temp=[]): 
... for i in li: 
...  if i>0: 
...   temp.append(i) 
...  else: 
...   if temp: yield temp 
...   temp=[] 
... if temp : yield temp 
... 

演示:

>>> list(grouper(X)) 
[[2, 3, 4.0, 1], [3], [2, 1, 5, 2, 6], [2.2, 1]] 
+1

OP提到正数,而不仅仅是非零数字! – LondonRob