(优发娱乐wwwyoufa8) python如何优雅地均匀地分割字符串

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

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

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

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

Pythons = abcdefghijklmn
n = 5 def avsplit1s, n: fn = lens//n rn = lens%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 xrangen] sr = [s[si[i]:si[i]+ar[i]] for i in xrangen] return sr def avsplit2s, n: fn = lens//n rn = lens%n sr = [] ix = 0 for i in xrangen: if i<rn: sr.appends[ix:ix+fn+1] ix += fn+1 else: sr.appends[ix:ix+fn] ix += fn return sr print avsplit1s,n
print avsplit2s,n

 s = ABCDEFGHIJKLMNOPQRSTUVWXYZ n = 3 print[s[i:i+n] for i in xrange0, lens, n] #[ABC, DEF, GHI, JKL, MNO, PQR, STU, VWX, YZ]

pythondef segmentediterable: def _segwidth: it = iterable while lenit > width: yield it[:width] it = it[width:] yield it return _seg
python>>> s = asdfghji
>>> split_every = segmenteds
>>> printlistsplit_every2
[as, df, gh, ji]
>>> printlistsplit_every3
[asd, fgh, ji]
>>> prints
asdfghji

发表评论

电子邮件地址不会被公开。 必填项已用*标注