分割一个字符串时最简单情况就是字符串的长度是分割份数的整数倍,例如:长度为10的字符串分割成2份。
但是当字符串的长度不是份数的整数倍时如何均匀地分割,例如:长度为11的字符串要分割成4份,有很多种分法,比如3, 3, 3, 2(前3个字符一份,中间3个一份,再中间3个一份,最后2个一份)这种是比较均匀的分法,即字符串的长度的方差最小。
现在问题来,在python中怎么才能写的比较pythonic ?
分割一个字符串时最简单情况就是字符串的长度是分割份数的整数倍,例如:长度为10的字符串分割成2份。
但是当字符串的长度不是份数的整数倍时如何均匀地分割,例如:长度为11的字符串要分割成4份,有很多种分法,比如3, 3, 3, 2(前3个字符一份,中间3个一份,再中间3个一份,最后2个一份)这种是比较均匀的分法,即字符串的长度的方差最小。
现在问题来,在python中怎么才能写的比较pythonic ?
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
def 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);
}
}
3 回答3.1k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
2 回答1.8k 阅读✓ 已解决
4 回答1.8k 阅读
3 回答1.7k 阅读
1 回答1.4k 阅读✓ 已解决
像下面的那样,基本思路是直接长度除分数得到每份的长度,如果有余数的话前余数份长度各加1。avsplit1看上去比avsplit2要pythonic 一些,但是性能方面avsplit2好点。