在Python中,赋值运算符可以将列表或元组解包为变量,如下所示:
l = (1, 2)
a, b = l # Here goes auto unpack
Run Code Online (Sandbox Code Playgroud)
但我需要在左侧列出与右侧列表中的项目计数完全相同的名称数量.但有时候我不知道右边列表的大小,例如,如果我使用split().
例:
a, b = "length=25".split("=") # This will result in a="length" and b=25
Run Code Online (Sandbox Code Playgroud)
但是以下代码将导致错误:
a, b = "DEFAULT_LENGTH".split("=") # Error, list has only one item
Run Code Online (Sandbox Code Playgroud)
有可能以某种方式解压缩上面示例中的列表所以我可以得到一个="DEFAULT_LENGTH"并且b等于None或不设置?直截了当的方式看起来有点长:
a = b = None
if "=" in string :
a, b = string.split("=")
else :
a = string
Run Code Online (Sandbox Code Playgroud)
Bri*_*ian 58
除非你使用的是Python 3,否则这对你没有用.但是,为了完整起见,值得注意的是,在那里引入的扩展元组解包允许你做以下事情:
>>> a, *b = "length=25".split("=")
>>> a,b
("length", ['25'])
>>> a, *b = "DEFAULT_LENGTH".split("=")
>>> a,b
("DEFAULT_LENGTH", [])
Run Code Online (Sandbox Code Playgroud)
即元组解包现在的工作方式类似于它在参数解包中的工作方式,因此您可以使用"其余项目"来表示*,并将它们作为(可能为空)列表.
然而,分区可能是您正在做的最佳解决方案.
Chr*_*rch 48
# this will result in a="length" and b="25"
a, b = "length=25".partition("=")[::2]
# this will result in a="DEFAULT_LENGTH" and b=""
a, b = "DEFAULT_LENGTH".partition("=")[::2]
Run Code Online (Sandbox Code Playgroud)
这比你的解决方案略胜一筹,但仍然不是很优雅; 如果有更好的方法,我不会感到惊讶.
a, b = (string.split("=") + [None])[:2]
Run Code Online (Sandbox Code Playgroud)
最好的方法是使用分区字符串方法:
在第一次出现sep时拆分字符串,并返回包含分隔符之前的部分的3元组,分隔符本身以及分隔符之后的部分.如果未找到分隔符,则返回包含字符串本身的3元组,后跟两个空字符串.
版本2.5中的新功能.
>>> inputstr = "length=25"
>>> inputstr.partition("=")
('length', '=', '25')
>>> name, _, value = inputstr.partition("=")
>>> print name, value
length 25
Run Code Online (Sandbox Code Playgroud)
它也适用于不包含以下内容的字符串=:
>>> inputstr = "DEFAULT_VALUE"
>>> inputstr.partition("=")
('DEFAULT_VALUE', '', '')
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因你在2.5之前使用的是Python版本,你可以使用list-slicing做同样的事情,如果稍微不整齐:
>>> x = "DEFAULT_LENGTH"
>>> a = x.split("=")[0]
>>> b = "=".join(x.split("=")[1:])
>>> print (a, b)
('DEFAULT_LENGTH', '')
Run Code Online (Sandbox Code Playgroud)
..以及何时x = "length=25":
('length', '25')
Run Code Online (Sandbox Code Playgroud)
轻松变成函数或lambda:
>>> part = lambda x: (x.split("=")[0], "=".join(x.split("=")[1:]))
>>> part("length=25")
('length', '25')
>>> part('DEFAULT_LENGTH')
('DEFAULT_LENGTH', '')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32063 次 |
| 最近记录: |