将任意大小的列表拆分为N个不相等的部分

时间:2014-06-10 07:41:41

标签: python list split

我看到splitting-a-list-of-arbitrary-size-into-only-roughly-n-equal-parts。怎么不平等分裂?我有列表,其中包含具有某些属性的项目(可以检索以针对每个项目运行相同功能的值),如何将具有相同属性的项目拆分为新列表,例如新的子列表? lambda相关的东西可以在这里工作吗?

简单的例子可能是:

list = [1, 1, 1, 2, 3, 3, 3, 3, 4, 4]

经过花哨的操作,我们可以:

list = [[1, 1, 1], [2], [3, 3, 3, 3], [4, 4]]

3 个答案:

答案 0 :(得分:2)

>>> L = [1, 1, 1, 2, 3, 3, 3, 3, 4, 4]
>>> [list(g) for i, g in itertools.groupby(L)]
[[1, 1, 1], [2], [3, 3, 3, 3], [4, 4]]
>>> L2 = ['apple', 'aardvark', 'banana', 'coconut', 'crow']
>>> [list(g) for i, g in itertools.groupby(L2, operator.itemgetter(0))]
[['apple', 'aardvark'], ['banana'], ['coconut', 'crow']]

答案 1 :(得分:0)

您应该使用标准库中的itertools.groupby函数。

此函数对它接收的iterable中的元素进行分组(默认情况下使用identity函数,即检查后续元素是否相等),并且对于每个组合元素的条带,它会重新组合由条纹代表组成的2元组(元素本身),以及条纹内元素的迭代器。

事实上:

l = [1, 1, 1, 2, 3, 3, 3, 3, 4, 4]

list(list(k[1]) for k in groupby(l))
>>> [[1, 1, 1], [2], [3, 3, 3, 3], [4, 4]]

P.S。你应该避免使用list作为变量名,因为它会与内置类型/函数冲突。

答案 2 :(得分:0)

这是一个非常简单的自己的解决方案。如果所讨论的'属性'只是项目的价值,那么有更直接的方法。

def split_into_sublists(data_list, sizes_list):
    if sum(sizes_list) != len(data_list):
        raise ValueError

    count = 0
    output = []
    for size in sizes_list:
        output.append(data_list[count:count+size])
        count += size
    return output


if __name__ == '__main__':
    data_list = [1, 1, 1, 2, 3, 3, 3, 3, 4, 4]
    sizes_list = [3,1,4,2]
    list2 = [[1, 1, 1], [2], [3, 3, 3, 3], [4, 4]]
    print(split_into_sublists(data_list, sizes_list) == list2) # True