Python字符串按逗号分割结果不符合预期的问题及函数调用相关概念咨询
Python字符串按逗号分割结果不符合预期的问题及函数调用相关概念咨询
我来帮你一步步理清这两个问题~
一、为什么分割结果不符合预期?
先看你的代码:
strg = "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17" def stat(strg): strg = [x.split() for x in strg.split(',')]
你的核心需求是把字符串按逗号分割成独立子串,但代码里多做了一步多余的操作,导致结果不符合预期:
- 第一步
strg.split(',')会把原字符串拆成这样的列表:['01|15|59', ' 1|47|6', ' 01|17|20', ' 1|32|34', ' 2|3|17']
注意后面几个元素前有空格,这是原字符串逗号后自带空格导致的。 - 然后你对每个元素
x调用split(),这个方法默认按任意空白字符分割字符串。对于无空格的元素'01|15|59',x.split()会返回['01|15|59'](单元素列表);带空格的元素如' 1|47|6',x.split()会返回['1|47|6'](自动忽略开头空格)。 - 最终你得到的是列表嵌套列表:
[['01|15|59'], ['1|47|6'], ['01|17|20'], ['1|32|34'], ['2|3|17']] - 你提到看到
strg[0] = 0,大概率是误操作了子列表的嵌套取值,比如strg[0][0][0]才会得到字符'0'。
正确的写法
如果你想要按逗号分割成干净的子串列表,只需去掉多余的split(),换成strip()去除前后空白,同时记得加return返回结果:
def stat(strg): # 按逗号分割后,对每个元素去除前后空白 return [x.strip() for x in strg.split(',')] # 调用函数并查看结果 result = stat(strg) print(result[0]) # 输出 '01|15|59',符合你的预期
二、三个表达式的区别解析
我们逐个拆解:
strg[0]- 如果
strg是原始字符串,这是取字符串的第一个字符,也就是'0'(原字符串开头是'0')。 - 如果
strg是处理后的列表(比如上面的result),这是取列表的第一个元素,也就是'01|15|59'。
- 如果
stat(strg[0])- 这是调用
stat函数,把strg[0]作为参数传入。 - 比如若
strg是原始字符串,strg[0]是字符'0',函数内部会对'0'执行分割逻辑,但因为原函数没有return,调用后只会得到None;如果函数有返回值,会得到'0'处理后的结果。 - 简单说,这是执行函数逻辑,传入的参数是
strg的第一个字符/元素,需要函数返回值才能拿到结果。
- 这是调用
stat[0]- 这是错误写法!
stat是函数对象,函数本身不支持下标访问(不能像列表那样用[0]取值),运行会直接抛出TypeError: 'function' object is not subscriptable错误。
- 这是错误写法!
正确的查看方式
如果你想检查处理后列表的第一个值,应该先调用函数得到结果列表,再取列表的第一个元素:
result = stat(strg) print(result[0])
备注:内容来源于stack exchange,提问作者g10
相关产品推荐
相关产品推荐

