我想写一个函数,将列表拆分成长度在2到4之间的子列表,不能多也不能少。
例如,这个列表["a","a","a","a","a","a","a","a","a"]
可以变成[["a","a","a","a"],["a","a","a"],["a","a"]]
或[["a","a","a"],["a","a","a","a"],["a","a"]]
。
我写了这个函数:
def split_list(lst):
result = []
sublist = []
for i in range(len(lst)):
sublist.append(lst[i])
if len(sublist) == 4 or (len(sublist) == 2 and i == len(lst)-1):
result.append(sublist)
sublist = []
elif len(sublist) == 3 and i == len(lst)-1:
result.append(sublist)
return result
但是["a","a","a","a","a","a","a","a","a"]
的输出是[['a', 'a', 'a', 'a'], ['a', 'a', 'a', 'a']]
,这是错误的。
对于少于三个值的列表,它必须输出该列表:例如["a","a"]
不能更改
我怎么能这么做?
3条答案
按热度按时间qnyhuwrf1#
有多种方法可以实现这一点,下面是一个算法:
1.如果子列表的长度为4,则将其添加到结果中,并将子列表重置为[]。
1.如果子列表的长度为3,并且只剩下2个项,则添加子列表,这样我们就不会在最后一个子列表中只剩下一个项
1.在循环结束时,将最终的子列表添加到结果中(如果它不为空)
这样,我们将从尽可能多的长度为4的项目开始,而不允许任何项目集的项目少于2个。
让我们用长度从0到14的列表来测试它。
给出的结果
6ljaweal2#
您可以一次在较高边界上拆分输入列表,然后检查最后一个项目/子列表是否适合较低边界(以覆盖主要需求):
测试:
一个一个一个一个一个x一个一个二个一个x一个一个三个一个x一个一个x一个四个一个
niknxzdl3#
检查完长度小于4的列表后,你可以用传统的方式通过分片来构建一个列表列表。然后,你只关心最后一个子列表。如果它的长度为1,你只需要适当地调整最后两个条目。如下所示: