将Python中的一个字符串拆分为3个段,指定给3个变量,具体取决于

2024-04-25 22:12:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

  • “seg\u a/seb\u b/其余部分”-> a = seg_a, b = seg_b, c = the_rest
  • “seg\u a/the\u rest”-> a = seg_a, b = None, c = the_rest
  • “seg\u a”-> a = seg_a, b = None, c = None

注:如果没有其他任命,则不存在没有价值的义务。它们可能不存在(例2中的b,例3中的b和c)。你知道吗

如果split得到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

我的问题(简短):

  • 什么是正确的,Python式的方法来把这根绳子分裂成它的另一半 段并将其指定为变量a、b和c?你知道吗

Tags: theto项目方法字符串innonerest
3条回答

你可以试试:

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

不过,我同意@DSM的观点:最具python风格的方法并不总是解决问题的最佳方法。一开始还可以,但更详细的代码在可读性方面效果最好。你知道吗

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

伊莫,什么是最顽皮的不是什么是最聪明的。如果某样东西简单、简洁、一目了然,那么就用它继续你的一天。如果你想强加的规则是

If split results in 1 item, it's given to variable a.
If split results in 2 items, it's given to variables a and c.
If split results in 3 items, it's given to variables a, b and 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在那里说我已经交换了bclen(p) == 2它很容易修复,一旦我看到问题。你知道吗

看起来确实有点奇怪,你愿意让变量不被定义,你必须稍后分支以避免得到一个NameError,这可以,也可能应该,通过一些重构来避免。根据我的经验,其他地方可能有点不对劲。即使没有任何改变,我也会包括a, b, c = [None]*3,我自己。你知道吗

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

我会做:

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

相关问题 更多 >