• 列表(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']

    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    zoj 3627#模拟#枚举
    Codeforces 432D Prefixes and Suffixes kmp
    hdu 4778 Gems Fight! 状压dp
    CodeForces 379D 暴力 枚举
    HDU 4022 stl multiset
    手动转一下田神的2048
    【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
    poj 3254 状压dp
    C++中运算符的优先级
    内存中的数据对齐
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/8819595.html
Copyright © 2020-2023  润新知