我看到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]]
答案 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