Python在列表中的每个重复特定int上划分一个int列表

时间:2017-04-03 03:06:17

标签: python list split

如何更改

等列表

[30,20,0,48,20,10,20,0,30]

为:

[[30,20],[48,20,10,20],[30]]

每次在列表中有0时将其除以?我尝试了很多方法,但它们都占用太多线条才有意义(10行)。我已经看了很多关于堆栈溢出的列表拆分问题,我找不到任何有用的东西。

编辑:

我在问是否有任何方法可以做list.split(0)或类似的事情,但似乎答案是没有办法做到这一点。我想知道我是否可以在一行中完成它,或者我是否可以使用通用模块。我已经尝试过多行,它已经工作了,但我认为这很不方便。

编辑2:

我试过的代码是:

list = [30,20,0,48,20,10,20,0,30]  #1, 1 list
newlist = []                       #2, 2 lists
addinglist = []                    #3, 3 lists
for x in list:                     #4
    if x == 0:                     #5
        newlist.append(addinglist) #6
        addinglist = []            #7
    else:                          #8
        addinglist.append(x)       #9 
newlist.append(addinglist)         #10
list = newlist                     #11 lines, 3 lists.
print(addinglist)

代码需要11行和3个列表(一个被修改,另外两个没用)。

3 个答案:

答案 0 :(得分:0)

这有效:

x=[10,20,30,0,4,5,6,0,1,1,1,1,1,1,0,1]

output=[]
temp=[]
for i in x:
    if i==0:
        output.append(temp)
        temp=[]
    else:
        temp.append(i)
output.append(temp)

输出的位置是:

[[10, 20, 30], [4, 5, 6], [1, 1, 1, 1, 1, 1], [1]]

代码很短,但我确信有更简洁的解决方案。

答案 1 :(得分:0)

正如TigerhawkT3所说:

  

启动结果列表,启动运行列表,附加到   只要条件成立,运行列表,并追加   当前列表并且每次开始一个新列表并非如此   共同的任务。请证明你自己尝试过一些东西   第一

事实上,这是一项非常简单的任务,可以在4个可重新排列的Python代码行中完成:

final=[]
for elem in [0]+x:
    if elem == 0: final.append([])
    else: final[-1].append(elem)

x是您的清单。

这个答案的目的不是告诉你如何去做。但是要告诉你,你可以发布任何相关的代码(并且不一定有效),这个答案会更容易接受。

总结:

  • 请记住展示你的研究,只是说要努力不计算,复制和粘贴你发现/制作的东西并不困难。

答案 2 :(得分:0)

  

我想知道是否可以一行完成,或者有什么办法   可以使用通用模块。

是的,两者都可以。您正在尝试对数据进行分组,因此groupby中的itertools是您的朋友:

from itertools import groupby

data = [30, 20, 0, 48, 20, 10, 20, 0, 30]

result = [list(group) for non_zero, group in groupby(data, lambda n: n != 0) if non_zero]

print(result)

输出

> python3 test.py
[[30, 20], [48, 20, 10, 20], [30]]
> 

我们正在使用键函数根据数据是否为零来捆绑数据。 group变量包含捆绑包; non_zero变量(又名key)是一个布尔值,指示是否是我们想要的捆绑包。