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']

    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    P2572 [SCOI2010]序列操作
    python学习笔记2
    嗯,python
    ETROBOT——审题
    条件编译
    第三章单片机简介
    模拟输入输出
    arduino库函数1
    arduino相关文献阅读
    Arduino的小灯亮起来~~~
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/8819595.html
Copyright © 2011-2022 走看看