我有这个:
from __future__ import print_function
def f_comma(p_string):
v_string = p_string
if (type(v_string) == type(int()) or type(v_string) == type(long()) or
type(v_string) == type(float())):
v_string = str(v_string)
else:
l_string = list(v_string)
for v_index in range(3, len(l_string), 4):
l_string.insert(v_index, ',')
v_result = ''.join(l_string)
return (v_result)
print (f_comma('qwertyuiopaq'))
似乎我无法弄明白为什么如果我使用超过11个字符的字符串,句点会停止插入,但只有11个字符,它可以正常工作。我在这篇文章中做错了什么?
答案 0 :(得分:12)
您可以在每个第n个字符后插入一个逗号:
>>> my_str = 'qwertyuiopaq'
>>> ','.join(my_str[i:i+3] for i in range(0, len(my_str), 3))
'qwe,rty,uio,paq'
这也适用于任意长度的字符串。
编辑:以与@ mhawke的答案类似的方式编写的函数,可以选择更改分组/字符。
>>> def f_comma(my_str, group=3, char=','):
... my_str = str(my_str)
... return char.join(my_str[i:i+group] for i in range(0, len(my_str), group))
...
>>> f_comma('qwertyuiopaq')
'qwe,rty,uio,paq'
>>> f_comma('qwertyuiopaq', group=2)
'qw,er,ty,ui,op,aq'
>>> f_comma('qwertyuiopaq', group=2, char='.')
'qw.er.ty.ui.op.aq'
答案 1 :(得分:2)
以下是使用切片执行此操作的另一种方法:
def f_comma(p_string, n=3):
return ','.join(p_string[i:i+n] for i in range(0, len(p_string), n))
我认为您的版本中的类型检查不是必需的。您的代码检查int,long或float的实例,然后将其中任何一个转换为字符串。您只需转换为字符串而不检查类型:
def f_comma(p_string, n=3):
p_string = str(p_string)
return ','.join(p_string[i:i+n] for i in range(0, len(p_string), n))
>>> f_comma('abcdefghijklmnop')
'abc,def,ghi,jkl,mno,p'
>>> f_comma(1234567890)
'123,456,789,0'
>>> import math
>>> f_comma(math.pi)
'3.1,415,926,535,9'
现在这不会处理所有unicode字符串:
>>> f_comma(u'abcdefg\u3030\u3031\u3032\u3033')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f_comma
UnicodeEncodeError: 'ascii' codec can't encode characters in position 7-10: ordinal not in range(128)
在这里,您可以使用isinstance()
(优于type() ==
)来帮助转换非字符串类型:
def f_comma(p_string, n=3):
if not isinstance(p_string, basestring): # str or unicode
p_string = str(p_string) # convert only non-strings
return ','.join(p_string[i:i+n] for i in range(0, len(p_string), n))
>>> f_comma(u'abcdefg\u3030\u3031\u3032\u3033') # returns unicode
u'abc,def,g\u3030\u3031,\u3032\u3033'
>>> f_comma('wowwowwowwow') # returns str
'wow,wow,wow,wow'
>>> f_comma(math.pi) # returns str
'3.1,415,926,535,9'
还要注意使用默认参数来指定段长度:
>>> f_comma('abcdefghijklmnop')
u'abc,def,ghi,jkl,mno,p'
>>> f_comma('abcdefghijklmnop', 6)
u'abcdef,ghijkl,mnop'
答案 2 :(得分:0)
这就是为什么它不起作用。 (而不是解决你的方法,这是一个非常低效的方法,正如其他人所示。)
当你.insert()
列表中的某些内容时,每个元素都会向前移动一个位置以腾出空间。
之前使用range(3, len(l_string), 4)
计算的索引不再是您想要的索引。