python如何优雅地均匀地分割字符串

    分割一个字符串时最简单情况就是字符串的长度是分割份数的整数倍,例如:长度为10的字符串分割成2份。

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

    现在问题来,在python中怎么才能写的比较pythonic ?

阅读 24.4k
4 个回答

像下面的那样,基本思路是直接长度除分数得到每份的长度,如果有余数的话前余数份长度各加1。avsplit1看上去比avsplit2要pythonic 一些,但是性能方面avsplit2好点。

Pythons = '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 xrange(n)]
    sr = [s[si[i]:si[i]+ar[i]] for i in xrange(n)]
    return sr

def avsplit2(s, n):
    fn = len(s)//n
    rn = len(s)%n
    sr = []
    ix = 0
    for i in xrange(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 avsplit1(s,n)
print avsplit2(s,n)
    s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    n = 3
    print([s[i:i+n] for i in xrange(0, len(s), n)])
    #['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STU', 'VWX', 'YZ']
pythondef segmented(iterable):
    def _seg(width):
        it = iterable
        while len(it) > width:
            yield it[:width]
            it = it[width:]
        yield it

    return _seg
python>>> s = 'asdfghji'
>>> split_every = segmented(s)
>>> print(list(split_every(2)))
['as', 'df', 'gh', 'ji']
>>> print(list(split_every(3)))
['asd', 'fgh', 'ji']
>>> print(s)
asdfghji

python3版

s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
i = 0
n = 3
l = []
for i, _ in enumerate(s):
    if i % n == 0:
        l.append(s[i:i + n])
    i += n
print(l)

Java版

import java.util.List;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int n = 3;
        List < String > l = new ArrayList < > ();
        for (int i = 0; i < s.length();) {
            if (i % n == 0) {
                l.add(s.substring(i, i + n < s.length() ? i + n : s.length()));
            }
            i += 3;
        }
        System.out.println(l);
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏