如何按条件将列表拆分为列表?

时间:2017-07-04 15:05:08

标签: python

我希望根据条件将列表拆分为多个列表。如果系列中的差异增长超过4,则触发将列表拆分为最后一个拆分项目中的该项目。

例如:

    $$$
    +
    LB
    C,0,82938DFF897 (C, public/random, address)

按条件

in = [1,2,3,9,10,11,100,200]
out = [ [1,2,3 ], [ 9,10,11 ], [100], [200]  ]

4 个答案:

答案 0 :(得分:3)

def splitlist(L):
    if not L: return []
    answer = [[L[0]]]

    for i in L[1:]:
        if i - answer[-1][-1] < 4:
            answer[-1].append(i)
        else:
            answer.append([i])
    return answer

输出:

In [112]: splitlist([1,2,3,9,10,11,100,200])
Out[112]: [[1, 2, 3], [9, 10, 11], [100], [200]]

答案 1 :(得分:2)

注意:中的下一个分别是Python关键字和内置函数。

诀窍是使用zip()函数和相同列表的2个切片,但转移到一个项目上:

in_list = [1, 2, 3, 9, 10, 11, 100, 200]

parts = [[]]
for prev_item, next_item in zip(in_list[:-1], in_list[1:]):
    top = parts[-1]
    top.append(prev_item)
    if next_item - prev_item > 4:
        parts.append([])
top = parts[-1]
top.append(in_list[-1])

输出结果为:

[[1, 2, 3], [9, 10, 11], [100], [200]]

答案 2 :(得分:2)

使用numpy模块的简短解决方案:

import numpy as np

arr = np.array([1,2,3,9,10,11,100,200])
out = [a.tolist() for a in np.split(arr, np.where(np.diff(arr) > 4)[0]+1)]
print(out)

输出:

[[1, 2, 3], [9, 10, 11], [100], [200]]
  • np.where(np.diff(arr) > 4) - 找到数据索引,其中条件&#34;下一个值与上一个值之间的差异大于4&#34; 符合

    < / LI>
  • np.split(x, indices) - 按关键指数分割初始数组

答案 3 :(得分:0)

可能的方法之一:

ls = [1,2,3,9,10,11,100,200, 201, 209]

#output list
output = list()
startind = 0

for ind, val in enumerate(ls):
    if ls[ind]-ls[ind-1] > 4:
        output.append(ls[startind:ind])
        startind = ind

# appending the left over from last detected difference of 4
output.append(ls[startind:])
print output

输出:[[1,2,3],[9,10,11],[100],[200,201],[209]]