为什么在split()结果中返回空string?

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

注意空的元素。 如果你正在分割一个恰好在位置1和string末尾的分隔符,那么它会给你带来从每一端返回的空string的额外值?

str.split补充str.join ,所以

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

让你回到原来的string。

如果空string不在那里,那么在join()之后,第一个和最后一个'/'

这里有两点需要考虑:

  • 期待'/segment/segment/'.split('/')等于['segment', 'segment']是合理的,但是这会丢失信息。 如果split()以你想要的方式工作,如果我告诉你a.split('/') == ['segment', 'segment'] ,你不能告诉我是什么。
  • 应该是'a//b'.split()是什么? ['a', 'b'] ?或['a', '', 'b'] ? 即,应split()合并相邻的分隔符? 如果应该的话,那么分析由字符分隔的数据将是非常困难的,并且一些字段可以是空的。 我相当肯定有很多人在上面的案例中想要结果的空值!

最后,归结为两点:

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

应该可以做复杂的事情,而且容易做简单的事情:如果你想忽略空string作为split()的结果,你总是可以做到:

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

但如果不想忽略空值, 应该可以。

语言必须selectsplit()一个定义 – 有太多不同的用例来满足每个人的默认需求。 我认为Python的select是一个很好的select,而且是最合乎逻辑的。 ( strtok()我不喜欢C的strtok()的原因之一是因为它合并了相邻的分隔符,所以很难用它进行严肃的parsing/标记。)

有一个例外:没有参数的a.split()挤压连续的空格,但是可以争辩说在这种情况下这是正确的。 如果你不想要的行为,你可以随时到a.split(' ')

一般来说,要删除在split()结果中返回的空string,您可能需要查看filter函数。

例:

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

回报

 ['segment', 'segment'] 

x.split(y)总是返回一个1 + x.count(y)项的列表是一个非常珍贵的规则 – 正如@ gnibbler已经指出的那样,它会将对象splitjoin (正如它们显然应该是这样)它还准确地映射了各种分隔符joinlogging的语义(如csv文件行[引用问题的networking],Unix /etc/group中的行等等),它允许(如@ Roman's答案提到)容易检查(例如)绝对与相对path(在文件path和URL),等等。

另一种看待这个问题的方法是,你不应该大肆地从窗口中拿出信息来获取收益。 将x.split(y)等同于x.strip(y).split(y)什么结果? 没有什么,当然 – 当你想要的时候很容易使用第二种forms,但是如果第一种forms被任意地认为是第二种forms,那么当你想要第一种forms的时候,你会有很多工作要做这是非常罕见的,正如前一段所指出的那样)。

但实际上,从math规律的angular度来看,可以通过自学来devise可传递的API,这是最简单也是最一般的方法。 举一个不同的例子,对于任何有效的xy x == x[:y] + x[y:]来说非常重要 – 它立即表明为什么一个切片的一个极端应该被排除。 你可以制定的不变断言越简单,就越有可能得到的语义是你在现实生活中所需要的 – 是math在处理宇宙方面非常有用的神秘事实的一部分。

尝试制定一个split方言的不变式,其中前导和尾随分隔符是特殊的…反例:诸如isspace类的string方法不是最简单的 – x.isspace()相当于x and all(c in string.whitespace for c in x) – 那个愚蠢的前导x and也是为什么你经常发现自己编码not x or x.isspace() ,以回到本来应该被devise成简单的is... string方法(空string“是”是你想要的任何东西 – 与街头马的意识相反,也许[空集,像零和c,一直困扰着大多数人;-)]],但是完全符合明显精致的math常识!

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

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

那么,它可以让你知道那里有一个分隔符。 所以,看到4个结果让你知道你有3个分隔符。 这使得你可以用这些信息来做任何你想做的事情,而不是让Python删除空的元素,然后让你手动检查起始或结束分隔符,如果你需要知道的话。

简单的例子:假设你想检查绝对与相对文件名。 这样你就可以完成所有的分割,而不必检查你的文件名的第一个字符是什么。