[英]Is it possible to assign a default value when unpacking?
我有以下內容:
>>> 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
我建議你考慮使用不同的方法,即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
[]
一般的解決方案是使用repeat
的None
值chain
你的iterable,然后使用結果的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
存在的原因。
這是解壓縮元組的一個通用解決方案,如果元組比預期短,則使用默認值:
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
你可以試試這個:
NUM2UNPACK=2
parts = myString.split()
first, second = parts+[None]*(NUM2UNPACK-(len(parts)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.