【问题标题】:good practice for string.partition in pythonpython中string.partition的好习惯
【发布时间】:2012-08-29 03:24:40
【问题描述】:

有时我会这样写代码:

a,temp,b = s.partition('-')

我只需要选择第一个和第三个元素。 temp 永远不会被使用。有没有更好的方法来做到这一点?

换句话说,有没有更好的方法来选择不同的元素来创建一个新列表?

例如,我想使用旧列表中的元素 0,1,3,7 创建一个新列表。这 代码是这样的:

newlist = [oldlist[0],oldlist[1],oldlist[3],oldlist[7]]

很丑,不是吗?

【问题讨论】:

  • 我不明白如何让它更漂亮,除非你想写一个函数或将 oldlist 重命名为更短的名字。

标签: python string variable-assignment


【解决方案1】:

小心使用

a, _, b = s.partition('-')

有时_ 用于国际化(gettext),所以你不会想不小心覆盖它。

通常我会为partition 这样做,而不是创建一个我不需要的变量

a, b = s.partition('-')[::2]

一般情况下是这样

from operator import itemgetter
ig0137 = itemgetter(0, 1, 3, 7)
newlist = ig0137(oldlist)

如果在循环中使用 itemgetter 比列表推导更有效

【讨论】:

  • 我喜欢它如何回答有关效率的实际问题,而不是简单地提供替代方法来调用。
【解决方案2】:

首先,还有这个替代方案:

a, b = s.partition('-')[::2]

对于后者,由于没有明确的间隔,因此无法将其做得太干净。但这可能适合您的需求:

newlist = [oldlist[k] for k in (0, 1, 3, 7)]

【讨论】:

  • 了解列表切片请参考this
  • @user1544915:第一个通过以 2 的间隔对列表进行切片,因此如果您有这样的列表:[0, 1, 2, 3, 4, 5],它将返回:[0, 2, 4]。如果您尝试[::3],它将返回[0, 3]
【解决方案3】:

您可以使用 Python 的扩展切片功能定期访问列表:

>>> a = range(10)
>>> # Pick every other element in a starting from a[1]
>>> b = a[1::2]
>>> print b
>>> [1, 3, 5, 7, 9]

负索引按您的预期工作:

>>> c = a[-1::-2]
>>> print c
>>> [9, 7, 5, 3, 1]

对于你的情况,

>>> a, b = s.partition('-')[::2]

【讨论】:

    【解决方案4】:

    Python 中选择第一个和第三个值的常见做法是:

    a, _, b = s.partition('-')
    

    要选择列表中的指定元素,您可以这样做:

    newlist = [oldlist[k] for k in (0, 1, 3, 7)]
    

    【讨论】:

      【解决方案5】:

      如果您不需要保留中间字段,您可以使用split(以及类似的rsplit)和可选的 maxsplit 参数来将拆分限制为分隔符的第一个(或最后一个)匹配项:

      a, b = s.split('-', 1)
      

      这避免了一次性的临时或额外的切片。

      唯一需要注意的是,splitpartition 不同,如果找不到分隔符,则返回原始字符串。解包的尝试将因此失败。 partition 方法总是返回一个三元组。

      【讨论】:

        猜你喜欢
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多