拆分Python列表

3
如果我有一个列表,如下所示:
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
我正在尝试编写一个函数,该函数输入一个列表,然后返回该列表中连续数字出现的次数,并返回包含这些数字列表的列表。 - Laura
3
专业提示:当有人要求更多细节时,不要只是用稍微不同顺序的相同单词! - jonrsharpe
1
哦,“consecutive positive numbers” 意思是“相邻的正数”。这样更有意义。 - khelwood
@Laura 至少给出3个带有输入和期望输出的示例。 - Martin Thoma
2个回答

7

不需要筛选出零。你可以简单地循环遍历列表,并将正数放入临时列表,直到遇到零为止。但是,对于这种任务,更Pythonic的方法是使用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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接