拆分列表 Python
Taking Apart A List Python
如果我有这样的列表:
X = [0, 2, 3, 4.0, 1, 0, 3, 0, 0, 0, 2, 1, 5, 2, 6, 0, 2.2, 1]
我将如何在 python 中编写代码以获取此列表并找到连续正数的数量,然后制作一个列表,其中包含其中每个连续数字的列表。
例如 x 的这个例子 return 数字 4
它也会 return:
[[ 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)
您不需要事先找出零的索引。您可以简单地保留另一个临时列表,其中包含自上次遇到 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]]
没有必要对零进行细化。您可以简单地遍历列表并将正数放入临时列表中,直到遇到零为止,但是作为此类任务的更 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
模块的情况下做到这一点,你可以使用以下函数,它根据前面的解释工作,并在每次遇到零时产生临时列表,最后 returns生成器包含正数列表,您可以通过调用 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]]
如果我有这样的列表:
X = [0, 2, 3, 4.0, 1, 0, 3, 0, 0, 0, 2, 1, 5, 2, 6, 0, 2.2, 1]
我将如何在 python 中编写代码以获取此列表并找到连续正数的数量,然后制作一个列表,其中包含其中每个连续数字的列表。
例如 x 的这个例子 return 数字 4 它也会 return:
[[ 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)
您不需要事先找出零的索引。您可以简单地保留另一个临时列表,其中包含自上次遇到 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]]
没有必要对零进行细化。您可以简单地遍历列表并将正数放入临时列表中,直到遇到零为止,但是作为此类任务的更 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
模块的情况下做到这一点,你可以使用以下函数,它根据前面的解释工作,并在每次遇到零时产生临时列表,最后 returns生成器包含正数列表,您可以通过调用 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]]