如何将列表划分为3个长度相等的部分(排序)-Python

如何将列表划分为3个长度相等的部分(排序)-Python,python,list,Python,List,好的,让我们假设一个长度为n的列表。n> =5 我必须在列表中选择两个索引作为切入点。这2个元素将被删除,因为列表将成为3个新列表 将有3个部分:A、B和C。 A必须大于或等于B。B必须大于或等于C。所有三个截面之间的差值最多只能为一个。在这些限制条件下,查找长度为n的列表的2个索引的公式是什么 例如,包含5个元素的列表。这两个索引分别是索引1和索引3 [1,2,3,4,5]=>[1][3][5],其中2和4是由于特定索引被剪切而删除的元素 例如,长度为19的较大列表 [1,2,3,4,5,6,

好的,让我们假设一个长度为n的列表。n> =5

我必须在列表中选择两个索引作为切入点。这2个元素将被删除,因为列表将成为3个新列表

将有3个部分:A、B和C。 A必须大于或等于B。B必须大于或等于C。所有三个截面之间的差值最多只能为一个。在这些限制条件下,查找长度为n的列表的2个索引的公式是什么

例如,包含5个元素的列表。这两个索引分别是索引1和索引3

[1,2,3,4,5]=>[1][3][5]
,其中2和4是由于特定索引被剪切而删除的元素

例如,长度为19的较大列表

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
作为切入点的索引是索引6和索引13

3个新形成的清单将是
[1,2,3,4,5,6]
[8,9,10,11,12,13]
[15,16,17,18,19]
。您可以看到,在规则状态下,前两个列表比最后一个列表大,并且每个列表之间的长度差不大于1

def split(myList):
    div, mod = divmod(len(myList)-2, 3)
    indices = [div] * 3

    for i in range(mod):
        indices[i] += 1

    parts = []
    for i in range(3):
        parts.append( myList[:indices[i]] )
        myList = myList[indices[i]+1:]
    return parts

print split(range(1,6))
print split(range(1,20))
输出:

[[1], [3], [5]]
[[1, 2, 3, 4, 5, 6], [8, 9, 10, 11, 12, 13], [15, 16, 17, 18, 19]]

概括为3件以上:

def findCutPoints(n,k):
    q,r = divmod(n-k+1,k)
    bigSteps = list(range(q+2,r*(q+2) + 1, q+2))
    littleSteps = list(range(r*(q+2) + (q+1),n,q + 1))
    return bigSteps + littleSteps
输出:

>>> findCutPoints(19,3)
[7, 14]
>>> findCutPoints(34,4)
[9, 18, 27]
请注意,此函数返回[1,…,n]范围内被删除的实际数字。这些数字的基于0的索引比1小,并且可以很容易地修改函数以给出索引而不是元素。为完整起见,以下是返回索引的修改版本(例如[6,13]而不是[7,14]):


@ozgur我认为这个问题与列表大小不相等时略有不同。你自己做过编码吗?@ozgur这个问题与dupe不同。这个问题涉及到序列中的跳跃。嗯,是的,我通过自己的实验发现了。对于第一个索引。我使用了
round((len(lst)-1)/3)
对于第二个,根据列表的长度有两种可能的结果。如果长度为偶数,则将第一个乘以2和+1。如果是奇数,那么就乘以2。它似乎与我的代码一起工作。@Sait我同意——这确实不是一个重复的问题,但比它据称重复的问题更微妙。
>>> findCutPoints(19,3)
[7, 14]
>>> findCutPoints(34,4)
[9, 18, 27]
def findCutPoints(n,k):
    q,r = divmod(n-k+1,k)
    bigSteps = list(range(q+1, r*(q+2), q+2))
    littleSteps = list(range(r*(q+2) + q, n, q + 1))
    return bigSteps + littleSteps