0

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

我有一个字符串(下面给出的示例状态)需要拆分(.split('/', 2))并指定(最多)3个变量(变量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

注意:如果没有指定其他内容,则没有义务赋予 None 值。它们可能不存在(例 2 中的 b,例 3 中的 b 和 c)。

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

我发现了 2 种实现这一点的方法,它们似乎都不是 Pythonic,因此导致了这个问题。

方法一:

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

我的问题(简短):

  • 什么是正确的 Pythonic 方法将这个字符串分割成它的段并将它们指定给变量 a、b 和 c?
4

3 回答 3

1

我会做:

l = to_split.split("/", 2)
a, b, c = l + [None] * (3 - len(l))
于 2013-01-26T16:37:38.767 回答
0

恕我直言,最 Pythonic 的不是最聪明的。如果某些东西一目了然,简洁明了,那么就使用它并继续您的一天。如果你想强加的规则是

如果拆分结果为 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))

我可以阅读并确切地知道它在做什么。如果那里有错误——比如说我已经换了bc什么时候换len(p) == 2——一旦我看到问题就很容易修复。

您愿意让变量未定义似乎有点奇怪——您必须稍后进行分支以避免得到 a NameError,并且可以并且可能应该通过一些重构来避免这种情况。根据我的经验,其他地方可能有点不对劲。即使不更改任何其他内容,我也会包括a, b, c = [None]*3, 我自己。

有助于保持代码可维护性的一条规则是,我们应该尽量减少我们告诉某人算法应该做什么和我们告诉计算机做什么之间的距离。在这里,由于您想要做的几乎可以直接转录成 Python,所以我会这样做。

于 2013-01-26T17:21:38.983 回答
0

你可以试试:

    a,b,c = (to_split("/",2) + [None]*3)[0:3]

但是我同意@DSM:最pythonic的方法并不总是解决问题的最佳方法。一开始可能没问题,但更冗长的代码在可读性方面效果最好。

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

于 2013-10-06T18:30:02.547 回答