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