【问题标题】:Is it possible to assign a default value when unpacking?解包时是否可以指定默认值?
【发布时间】:2025-12-20 07:35:11
【问题描述】:

我有以下几点:

>>> myString = "has spaces"
>>> first, second = myString.split()
>>> myString = "doesNotHaveSpaces"
>>> first, second = myString.split()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

如果字符串没有任何空格,我希望 second 默认为 None。我目前有以下内容,但想知道是否可以在一行中完成:

splitted = myString.split(maxsplit=1)
first = splitted[0]
second = splitted[1:] or None

【问题讨论】:

  • 据我所知这是不可能的,因为 split 函数是这样写的。但是你可以使用 if 语句,比如字符串中是否有空格。

标签: python python-3.x iterable-unpacking


【解决方案1】:

我建议您考虑使用不同的方法,即partition 而不是split

>>> myString = "has spaces"
>>> left, separator, right = myString.partition(' ')
>>> left
'has'
>>> myString = "doesNotHaveSpaces"
>>> left, separator, right = myString.partition(' ')
>>> left
'doesNotHaveSpaces'

如果您使用的是 python3,则可以使用此选项:

>>> myString = "doesNotHaveSpaces"
>>> first, *rest = myString.split()
>>> first
'doesNotHaveSpaces'
>>> rest
[]

【讨论】:

  • 太棒了! :) 任务的正确工具。
【解决方案2】:

一般的解决方案是使用repeatNone 值对chain 迭代,然后使用结果的islice

from itertools import chain, islice, repeat

none_repat = repeat(None)
example_iter = iter(range(1)) #or range(2) or range(0)

first, second = islice(chain(example_iter, none_repeat), 2)

这将用None 填充缺失值,如果你需要这种功能很多,你可以把它放入这样的函数中:

def fill_iter(it, size, fill_value=None):
    return islice(chain(it, repeat(fill_value)), size)

虽然到目前为止最常见的用途是字符串,这就是存在 str.partition 的原因。

【讨论】:

    【解决方案3】:

    如果元组比预期的短,这是解包元组并使用默认值的一种通用解决方案:

    unpacker = lambda x,y=1,z=2:(x,y,z)
    
    packed = (8,5)
    a,b,c = unpacker(*packed)
    print(a,b,c) # 8 5 2
    
    packed = (8,)
    a,b,c = unpacker(*packed)
    print(a,b,c) # 8 1 2
    

    Play with this code

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      NUM2UNPACK=2   
      parts = myString.split()    
      first, second = parts+[None]*(NUM2UNPACK-(len(parts)))     
      

      【讨论】:

        最近更新 更多