Mat*_*hew 3 python split list subset
我昨晚问过这个问题,但我的措辞很糟糕。我正在尝试列出以下内容:
['milk','eggs','beef','oranges','dog food','chips','soda','bread']
Run Code Online (Sandbox Code Playgroud)
并将其分成n每个列表,任何余数都需要均匀地添加到列表中..所以结果将是n = 3:
[['milk','eggs','beef'],['oranges','dog food','chips']]
Run Code Online (Sandbox Code Playgroud)
剩下的:['soda','bread']这会给我最终结果:
[['milk','eggs','beef','soda'],['oranges','dog food','chips','bread']]
Run Code Online (Sandbox Code Playgroud)
顺序并不重要。
一个简短但有效的解决方案:
def splitList (lst, n):
it = iter(lst)
new = [[next(it) for _ in range(n)] for _ in range(len(lst) // n)]
for i, x in enumerate(it):
new[i].append(x)
return new
Run Code Online (Sandbox Code Playgroud)
>>> lst = ['milk', 'eggs', 'beef', 'oranges', 'dog food', 'chips', 'soda', 'bread']
>>> splitList(lst, 3)
[['milk', 'eggs', 'beef', 'soda'], ['oranges', 'dog food', 'chips', 'bread']]
>>> splitList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3)
[[1, 2, 3, 10], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)
首先创建一个迭代器,我们将其用于所有事情;所以总共我们只在列表上循环一次。将创建的子列表的数量为len(lst) // n(整数除法向下舍入),对于每个子列表,我们n从迭代器中获取值。
之后,剩余的项目仍将保留在迭代器中,因此我们可以简单地迭代其余项目并将它们直接附加到子列表中。