Python列表字符数统计结果错误,寻求问题原因排查
问题原因分析
你遇到的问题核心在于字节串(bytes)和字符串(str)的长度计算逻辑完全不同:
- 对
bytes对象调用len()时,返回的是它占用的字节数量; - 而你想要统计的是实际的Unicode字符数量,这需要先把字节串解码成普通字符串再计算长度。
你代码里的元素是b'#Repost@motivated.mindset\n\xe3\x83\xbb\xe3\x83\xbb\xe3\x83\xbb\',这是一个UTF-8编码的字节串:
- 像
\xe3\x83\xbb这样的序列是UTF-8编码的单个Unicode字符ー,它占用3个字节,但作为字符只能算1个; - 其他ASCII字符(比如
#、@、字母等)每个占用1个字节,字符数和字节数一致。
修正后的代码
只需要在计算长度前,把字节串用decode('utf-8')解码成字符串即可:
words = [b'#Repost@motivated.mindset\n\xe3\x83\xbb\xe3\x83\xbb\xe3\x83\xbb\''] sum1 = sum(len(i.decode('utf-8')) for i in words) print(sum1)
补充说明
如果你不确定字节串的编码格式,也可以在decode()时加上errors='replace'参数,避免因为编码不匹配抛出异常:
sum1 = sum(len(i.decode('utf-8', errors='replace')) for i in words)
这样就能得到你期望的实际字符总数了。
内容的提问来源于stack exchange,提问作者Sanket Badhe
相关产品推荐
相关产品推荐

