为什么split()结果中返回空字符串?

时间:2010-02-04 05:14:53

标签: python string split

'/segment/segment/'.split('/')返回['', 'segment', 'segment', '']有什么意义?

注意空元素。如果你正在拆分碰巧位于第一个位置和一个字符串末尾的分隔符,那么从每个端点返回空字符串会给你什么额外的值呢?

7 个答案:

答案 0 :(得分:140)

str.split补充str.join,所以

"/".join(['', 'segment', 'segment', ''])

让你回到原来的字符串。

如果没有空字符串,'/'

后会丢失第一个和最后一个join()

答案 1 :(得分:41)

更一般地说,要删除split()结果中返回的空字符串,您可能需要查看filter函数。

示例:

filter(None, '/segment/segment/'.split('/'))

返回

['segment', 'segment']

答案 2 :(得分:27)

这里有两点需要考虑:

  • 期望'/segment/segment/'.split('/')的结果等于['segment', 'segment']是合理的,但这会丢失信息。如果split()以您想要的方式运作,如果我告诉您a.split('/') == ['segment', 'segment'],则无法告诉我a是什么。
  • 'a//b'.split()的结果应该是什么? ['a', 'b']?或['a', '', 'b']?即,split()应该合并相邻的分隔符吗?如果它应该,则解析由字符分隔的数据将非常困难,并且某些字段可能为空。我很确定有很多人想要上述案例的结果中的空值!

最后,归结为两件事:

一致性:如果我在n中有a个分隔符,则会在n+1之后返回split()个值。

应该可以做复杂的事情,并且很容易做简单的事情:如果你想忽略split()之后的空字符串,你可以随时这样做:

def mysplit(s, delim=None):
    return [x for x in s.split(delim) if x]

但是如果一个人不想忽略空值,那么一个应该能够。

语言必须选择split()的一个定义 - 有太多不同的用例来满足每个人的默认要求。我认为Python的选择是好的,并且是最合乎逻辑的。 (顺便说一句,我不喜欢C strtok()的原因之一是因为它合并了相邻的分隔符,因此很难用它进行严格的解析/标记化。)

有一个例外:a.split()没有参数会挤压连续的空格,但有人可以说这是正确的做法。如果您不想要这种行为,可以随时a.split(' ')

答案 3 :(得分:7)

x.split(y)始终返回1 + x.count(y)个项目列表是一个宝贵的规律性 - 因为@ gnibbler已经指出它会使splitjoin完全互相反转(因为它们显然应该是),它还精确地映射了各种分隔符连接记录的语义(例如csv文件行[[引用问题的网]],来自/etc/group的行中的行,等等),它允许(如@ Roman提到的答案)轻松检查(例如)绝对路径和相对路径(在文件路径和URL中),等等。

另一种看待它的方法是你不应该只是将信息扔出窗外而不能获得收益。使x.split(y)等同于x.strip(y).split(y)会获得什么?当然没什么 - 当你的意思是第二种形式时,很容易使用第二种形式,但如果第一种形式被认为是第二种形式,那么当你做时,你需要做很多工作。 strong>想要第一个(这很少见,如前一段所述)。

但实际上,在数学规律性方面进行思考是您可以自学设计可通过API的最简单,最通用的方法。举一个不同的例子,对于任何有效的xy x == x[:y] + x[y:]来说非常重要 - 这可以立即指出切割的一个极端应排除的原因。你可以制定的不变断言越简单,所得到的语义就越有可能是你在现实生活中所需要的 - 这是数学在处理宇宙时非常有用的神秘事实的一部分。

尝试为split方言制定不变量,其中前导和尾随分隔符是特殊的...反例:isspace之类的字符串方法不是最简单的 - {{1相当于x.isspace() - 愚蠢的领导x and all(c in string.whitespace for c in x)就是为什么你经常发现自己编码x and,以回到所具有的简单性被设计成not x or x.isspace()字符串方法(其中空字符串“是”你想要的任何东西 - 与街头马匹感觉相反,可能[[空集,如零& c,有总是困惑大多数人;-)]],但完全符合明显精心设计的数学常识! - )。

答案 4 :(得分:5)

我不确定你在找什么样的答案?你得到三场比赛,因为你有三个分隔符。如果您不想要那个空的,只需使用:

'/segment/segment/'.strip('/').split('/')

答案 5 :(得分:5)

嗯,它让你知道那里有一个分隔符。因此,看到4个结果可以让您知道您有3个分隔符。这使您可以使用此信息执行任何操作,而不是让Python删除空元素,然后在需要知道时手动检查开始或结束分隔符。

简单示例:假设您要检查绝对文件名和相对文件名。通过这种方式,您可以通过拆分完成所有操作,而无需检查文件名的第一个字符是什么。

答案 6 :(得分:3)

考虑以下最小示例:

>>> '/'.split('/')
['', '']

split必须提供分隔符'/'之前和之后的内容,但没有其他字符。因此,必须为您提供一个空字符串,该字符串在技术上在'/'之前和之后,因为'' + '/' + '' == '/'