Python分割字符串如实现最优雅,python分割字符串, 分割一个字符串时最简
Python分割字符串如实现最优雅,python分割字符串, 分割一个字符串时最简
分割一个字符串时最简单情况就是字符串的长度是分割份数的整数倍,例如:长度为10的字符串分割成2份。
但是当字符串的长度不是份数的整数倍时如何均匀地分割,例如:长度为11的字符串要分割成4份,有很多种分法,比如3, 3, 3, 2(前3个字符一份,中间3个一份,再中间3个一份,最后2个一份)这种是比较均匀的分法,即字符串的长度的方差最小。
现在问题来,在python中怎么才能写的比较pythonic ?
像下面的那样,基本思路是直接长度除分数得到每份的长度,如果有余数的话前余数份长度各加1。avsplit1看上去比avsplit2要pythonic 一些,但是性能方面avsplit2好点。
Pythons = 'abcdefghijklmn'n = 5def 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 srdef 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 srprint avsplit1(s,n)print avsplit2(s,n)
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
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']
编橙之家文章,
相关内容
- 求python高手解答python源码中False是什么意思,pythonfals
- python判断对象类型数组的方法,python判断对象数组,RT
- python伪造出一个正确的session id并进行不好的行为吗?,
- python给指定范围内循环变量方法是?,python变量,Hi,在
- Python flask只能return吗,pythonflaskreturn,from flask i
- Python猜数字游戏结果第一次不输出问题,python猜数字
- 关于设置WTForms初始化默认值的一个问题,wtforms初始化
- Python from tutorial.items import DmozItem报错问题,,items.py文件
- 多行python print信息中,怎么能目标是哪个print输出的呢
- 求问嵌套问题,列表里边可以放字典类型的数据吗?,
评论关闭