切割一个列表为 n 个几乎等长的分区

12 浏览
0 Comments

切割一个列表为 n 个几乎等长的分区

我正在寻找一种快速、干净、符合Python风格的方法将一个列表分成n个几乎相等的分区。

partition([1,2,3,4,5],5)->[[1],[2],[3],[4],[5]]
partition([1,2,3,4,5],2)->[[1,2],[3,4,5]] (或者[[1,2,3],[4,5]])
partition([1,2,3,4,5],3)->[[1,2],[3,4],[5]] (这个问题还有其他的切割方法)

在这里的Iteration over list slices中有几个答案非常接近我想要的,只是它们关注的是列表的大小,而我关心的是列表的数量(其中一些还用None进行了填充)。显然,这些可以很容易地进行转换,但我想要的是最佳实践。

类似地,人们在这里How do you split a list into evenly sized chunks?也指出了很好的解决方案,针对的是一个非常类似的问题,但我更关心的是分区的数量,而不是具体的大小,只要在1个以内。同样,这也可以很容易地进行转换,但我想要的是最佳实践。

0
0 Comments

问题的出现原因:在给定一个列表和一个整数n的情况下,需要将列表切分为n个近乎相等长度的子列表。

解决方法:通过编写一个函数来实现列表的切分。函数的输入参数包括列表lst和整数n,函数的输出结果为将列表切分为n个近乎相等长度的子列表。

具体的解决方法如下所示(使用Python语言编写):

def partition(lst, n):
    return [lst[i::n] for i in range(n)]

以上代码使用了列表推导式来实现切分操作。列表推导式中的表达式`lst[i::n]`表示从索引i开始,以步长n对列表进行切片。

下面是一个示例,展示了如何使用上述函数来将一个列表切分为10个近乎相等长度的子列表:

partition(range(105), 10)
# [[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
# [1, 11, 21, 31, 41, 51, 61, 71, 81, 91, 101],
# [2, 12, 22, 32, 42, 52, 62, 72, 82, 92, 102],
# [3, 13, 23, 33, 43, 53, 63, 73, 83, 93, 103],
# [4, 14, 24, 34, 44, 54, 64, 74, 84, 94, 104],
# [5, 15, 25, 35, 45, 55, 65, 75, 85, 95],
# [6, 16, 26, 36, 46, 56, 66, 76, 86, 96],
# [7, 17, 27, 37, 47, 57, 67, 77, 87, 97],
# [8, 18, 28, 38, 48, 58, 68, 78, 88, 98],
# [9, 19, 29, 39, 49, 59, 69, 79, 89, 99]]

以上结果展示了将长度为105的列表切分为10个近乎相等长度的子列表。

此外,还有一些评论提到了其他的解决方法和改进建议。例如,使用`zip(*partition(range(105),10))`可以将切分后的子列表重新合并为原始的列表。另外,还提到了使用`itertools.izip_longest`函数来实现切分,以及保持子列表连续性的另一种解决方法。

通过编写一个函数并使用列表推导式,可以将一个列表切分为n个近乎相等长度的子列表。根据实际需求,还可以使用其他方法来处理切分后的子列表。

0
0 Comments

问题的出现原因是需要将一个列表分割成n个近似相等长度的分区。该问题的解决方法是使用以下的代码:

def partition(lst, n):
    q, r = divmod(len(lst), n)
    indices = [q*i + min(i, r) for i in xrange(n+1)]
    return [lst[indices[i]:indices[i+1]] for i in xrange(n)]

这个方法将列表分成尽可能相等长度的分区,并将较大的分区放在前面。它避免使用浮点数运算,因为这通常会使人感到不舒服。

以下是一个示例,以显示与Daniel Stutzbach的解决方法的对比:

>>> print [len(x) for x in partition(range(105), 10)]
[11, 11, 11, 11, 11, 10, 10, 10, 10, 10]

0
0 Comments

问题的出现是因为原始的分割函数在处理非常规的例子时无法正确工作。例如,在将长度为105的列表分割成10个子列表时,最后一个子列表只有6个元素,而不是期望的11个元素。

要解决这个问题,可以通过对分割函数进行修改来确保每个子列表的长度几乎相等。可以使用Python的round函数来四舍五入计算每个子列表的起始和结束索引。

下面是修改后的分割函数的Python 3版本代码:

def partition(lst, n):
    division = len(lst) / n
    return [lst[round(division * i):round(division * (i + 1))] for i in range(n)]

这样修改后,对于给定的例子partition(range(105), 10),将得到5个包含10个元素和5个包含11个元素的子列表。

这个修改确保了每个子列表的长度几乎相等,解决了原始问题中出现的长度不一致的情况。

0