zoukankan      html  css  js  c++  java
  • 列表(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']

    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    mysql触发器实时检测一条语句进行备份删除
    ORA-12560: TNS: 协议适配器错误 windows
    DG:windows密码文件
    vim already exists!
    k8s 集群升级
    部署 k8s 备份工具 velero
    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
    lens 添加 k8s 集群
    redis系列
    s3c2440裸机-I2c编程-3.i2c中断服务程序
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/8819595.html
Copyright © 2011-2022 走看看