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

oro*_*aki 107 python string split

什么是点'/segment/segment/'.split('/')回来['', 'segment', 'segment', '']

注意空元素.如果你正在拆分碰巧位于第一个位置和一个字符串末尾的分隔符,它会给你从每一端返回空字符串的额外值是多少?

Joh*_*ooy 152

str.split补充str.join,所以

"/".join(['', 'segment', 'segment', ''])
Run Code Online (Sandbox Code Playgroud)

让你回到原来的字符串.

如果没有空字符串,那么第一个和最后一个字符串'/'将丢失join()

  • 很简单,但完全回答了这个问题. (9认同)
  • 那么,您是不是将Microsoft Word用作Python IDE呢?:) (6认同)

Fra*_*urt 59

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

例:

filter(None, '/segment/segment/'.split('/'))
Run Code Online (Sandbox Code Playgroud)

回报

['segment', 'segment']
Run Code Online (Sandbox Code Playgroud)

  • 如果您更喜欢列表推导式:`[x for x in '/segment/segment/'.split('/') if x]` (13认同)
  • 如果希望在列表中收集结果而不是将过滤器对象作为输出,则将整个过滤器结构放在`list(...)`中. (4认同)
  • 谢谢你,我不知道为什么这个答案如此之遥,其他一切都是最基本的东西。 (3认同)

Alo*_*hal 28

这里有两个要点需要考虑:

  • 期待的结果'/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]
Run Code Online (Sandbox Code Playgroud)

但如果一个人不想忽略空值,就应该能够.

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

有一个例外:a.split()没有参数会挤压连续的空白区域,但可以说在这种情况下这是正确的做法.如果您不想要这种行为,您可以随时使用a.split(' ').


Ale*_*lli 7

x.split(y)始终返回列表1 + x.count(y)项是一种珍贵的规律性-为@ gnibbler本已指出,这让splitjoin对方的确切逆(因为它们显然应该是),这也正是各种分隔符连记录的语义(映射例如csv文件行[[net of quoting issues]],来自/etc/groupUnix的行等等,它允许(如@ Roman的回答所提到的)轻松检查(例如)绝对路径和相对路径(在文件路径和URL中),等等.

另一种看待它的方法是你不应该只是将信息扔出窗外而不能获得收益.制作x.split(y)等同于什么会获得什么x.strip(y).split(y)?没事,当然-它很容易使用第二种形式时,这就是你的意思,但如果第一种形式是任意视为指第二个,你有很多工作要做,当你希望第一个(这是非常罕见的,正如前一段所指出的那样).

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

尝试为一个split方言制定不变量,其中前导和尾随分隔符是特殊的...反例:字符串方法,如isspace不是最简单的 - x.isspace()相当于x and all(c in string.whitespace for c in x)- 愚蠢的领导x and是你经常发现自己编码的原因not x or x.isspace(),回到应该设计成is...字符串方法的简单性(其中空字符串"是"你想要的任何东西 - 与街头马匹感觉相反,也许[[空集,如零] &c,总是困惑大多数人;-)]],但完全符合明显精细的数学常识! - ).


jam*_*ieb 5

我不确定您要寻找什么样的答案?您有三个匹配项,因为您有三个定界符。如果您不想要那个空的,只需使用:

'/segment/segment/'.strip('/').split('/')
Run Code Online (Sandbox Code Playgroud)

  • -1是因为您得到四场比赛而不是三场比赛,这也并不能真正回答问题。 (3认同)
  • +1 来抵消否定..他没有说你会得到三个结果。他说“三个分隔符”是“三个匹配”,这对我来说听起来很合乎逻辑。然而,你不会得到任何东西的“四场比赛”。不过,您确实会在结果中返回“四个元素”。另外,它并没有直接回答“为什么”,但它确实提供了一种简单的方法来获得他真正想要的东西……我认为这不值得投反对票。如果您要挑剔某人(投反对票,不少于),请更加小心!干杯! 8^) (2认同)

Rom*_*man 5

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

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