列表(list)之三 -如何较为均匀的将任意字符串按指定组数分组,方差最少

      当字符串的长度不是份数的整数倍时如何均匀地分割,例如:长度为11的字符串要分割成4份,有很多种分法,比如3, 3, 3, 2(前3个字符一份,中间3个一份,再中间3个一份,最后2个一份)这种是比较均匀的分法,即字符串的长度的方差最小。

思路:要把14个字符,分成3组,则可先得到三组列表,每组4个字符,14/3余数2,则将余数2分别均匀的添加到两组列表中,则得4,5,5

实例:

s = "abcdefghijklmn"
n = 5

方法一:

 

def avsplit1(s, n):
    fn = len(s)//n
    rn = len(s)%n
    ar = [fn+1]*rn+ [fn]*(n-rn)
    si = [i*(fn+1) if i<rn else (rn*(fn+1)+(i-rn)*fn) for i in range(n)]
    sr = [s[si[i]:si[i]+ar[i]] for i in range(n)]


    return sr

print(avsplit1(s,n))

输出:

['abc', 'def', 'ghi', 'jkl', 'mn']

 

方法二:

def avsplit2(s, n):
    fn = len(s)//n
    rn = len(s)%n
    sr = []
    ix = 0


    for i in range(n):
        if i<rn:
        sr.append(s[ix:ix+fn+1])
        ix += fn+1
    else:
       sr.append(s[ix:ix+fn])
       ix += fn
    return sr

print(avsplit2(s,n))

输出:

['abc', 'def', 'ghi', 'jkl', 'mn']

 

posted @ 2018-04-13 12:37  神毓·逍遥  阅读(634)  评论(0编辑  收藏  举报