将Python中的字符串拆分为3个段,根据项目计数指定给3个变量

将Python中的字符串拆分为3个段,根据项目计数指定给3个变量,python,python-2.7,list-comprehension,python-2.x,try-except,Python,Python 2.7,List Comprehension,Python 2.x,Try Except,我是Python新手,正在努力以最具Python风格的方式解决以下问题 我有一个字符串(下面给出的示例状态),需要拆分(.split('/',2))并指定(最多)3个变量(vars.a、b和c)。字符串是一个URL,我需要将其拆分为3个部分 字符串及其段可以是以下示例: “seg_a/seb_b/the_rest”->a=seg_a,b=seg_b,c=the_rest “seg_a/the_rest”->a=seg_a,b=None,c=the_rest “seg_a”->a=seg_a,b

我是Python新手,正在努力以最具Python风格的方式解决以下问题

我有一个字符串(下面给出的示例状态),需要拆分(
.split('/',2)
)并指定(最多)3个变量(vars.a、b和c)。字符串是一个URL,我需要将其拆分为3个部分

字符串及其段可以是以下示例:

  • “seg_a/seb_b/the_rest”
    ->a=seg_a,b=seg_b,c=the_rest
  • “seg_a/the_rest”
    ->a=seg_a,b=None,c=the_rest
  • “seg_a”
    ->a=seg_a,b=None,c=None
注意:如果没有其他指定,则不存在不赋予任何价值的义务。它们可能不存在(例2为b,例3为b和c)

如果拆分结果为1项,则将其指定给变量a。 如果拆分结果为2项,则将其指定给变量a和c 如果拆分结果为3项,那么它的段将被赋予变量a、b和c

我发现有两种方法实现了这一点,它们似乎都不是Pythonic,因此产生了这个问题

方法A:

Split.
Count.
Depending on count, appoint segments to variables with IF.. Elif.. Elif.. Else. statement
方法B: 使用列表理解和嵌套的Try-Except块。例:

try:
    a, b, c = [i for i in to_split.split("/", 2)]
except ValueError:
    try:
        a, c =  [i for i in to_split.split("/", 1)]
        b = None
    except ValueError:
        a = to_split
        b, c = None, None
我的问题(简短):

Split.
Count.
Depending on count, appoint segments to variables with IF.. Elif.. Elif.. Else. statement
  • 什么是正确的,python式的方法将这个字符串拆分为它的 分段并将其指定为变量a、b和c
    • 我会:

      l = to_split.split("/", 2)
      a, b, c = l + [None] * (3 - len(l))
      

      嗯,最具蟒蛇精神的并不是最聪明的。如果某样东西简单、简洁、一目了然,那么就使用它,继续你的一天。如果你想强加的规则是

      如果拆分结果为1项,则将其指定给变量a。
      如果拆分结果为2项,则将其分配给变量a和c。
      如果拆分结果为3项,则将其分配给变量a、b和c

      然后实现这个,方法A风格

      p = to_split.split("/", 2)
      if len(p) == 1:
          a, = p
      elif len(p) == 2:
          a, c = p
      elif len(p) == 3:
          a, b, c = p
      else:
          raise ValueError("could not parse {}".format(to_split))
      
      我能读到这篇文章,知道它到底在做什么。如果那里有一个bug——比如说,当
      len(p)=2时,我交换了
      b
      c
      ——一旦我看到问题,就很容易修复

      您愿意让变量不被定义,这确实有点奇怪——您必须稍后进行分支以避免出现
      namererror
      ,这可以,也可能应该通过一些重构来避免。根据我的经验,其他地方可能有点不对劲。即使不改变任何其他内容,我也会包括自己的
      a、b、c=[None]*3

      有一条规则有助于保持代码的可维护性,那就是我们应该尽量缩短告诉别人算法应该做什么和告诉计算机应该做什么之间的距离。在这里,因为您要做的几乎可以直接转录到Python中,所以我就这么做。

      您可以尝试:

          a,b,c = (to_split("/",2) + [None]*3)[0:3]
      
      然而,我同意@DSM的观点:最具python风格的方法并不总是解决问题的最佳方法。一开始可能还可以,但从可读性方面来说,更详细的代码效果最好

      这就是我喜欢Python的原因之一:有几种方法可以解决问题,开发人员可以根据自己的需要选择最好的方法