我有一个大小< N的列表,我想用一个值填充大小为N.
当然,我可以使用类似下面的东西,但我觉得应该有一些我错过的东西:
>>> N = 5
>>> a = [1]
>>> map(lambda x, y: y if x is None else x, a, ['']*N)
[1, '', '', '', '']
Run Code Online (Sandbox Code Playgroud) 在Perl我能做到:
my ($x, $y) = split /:/, $str;
Run Code Online (Sandbox Code Playgroud)
无论字符串是否包含模式,它都将起作用.
在Python中,但这不起作用:
a, b = "foo".split(":") # ValueError: not enough values to unpack
Run Code Online (Sandbox Code Playgroud)
在这种情况下防止错误的规范方法是什么?
我总是对这个事实感到恼火:
$ cat foo.py
def foo(flag):
if flag:
return (1,2)
else:
return None
first, second = foo(True)
first, second = foo(False)
$ python foo.py
Traceback (most recent call last):
File "foo.py", line 8, in <module>
first, second = foo(False)
TypeError: 'NoneType' object is not iterable
Run Code Online (Sandbox Code Playgroud)
事实是,为了正确解压而没有麻烦,我要么捕获TypeError,要么有类似的东西
values = foo(False)
if values is not None:
first, second = values
Run Code Online (Sandbox Code Playgroud)
这有点烦人.有没有一个技巧可以改善这种情况(例如,在没有foo返回(无,无)的情况下将第一个和第二个设置为无)或关于像我提出的案例的最佳设计策略的建议?*变量可能吗?
我有以下内容:
>>> 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
Run Code Online (Sandbox Code Playgroud)
如果字符串没有任何空格,我想second默认None.我目前有以下内容,但我想知道是否可以在一行中完成:
splitted = myString.split(maxsplit=1)
first = splitted[0]
second = splitted[1:] or None
Run Code Online (Sandbox Code Playgroud) 如果要解压缩的值的数量与变量列表相比太少,有没有办法获得默认值?
例如:
a, b, c = read_json(request)
Run Code Online (Sandbox Code Playgroud)
如果read_json返回三个或更多变量的数组,则此方法有效.如果它只返回两个,我在分配时会出现异常c.那么,c如果无法正确解压缩,有没有办法设置为默认值?就像是:
a, b, (c=2) = read_json(request)
Run Code Online (Sandbox Code Playgroud)
这与使用默认参数定义函数时的操作类似.
谢谢!
应该如何将 aiterable解包为数量不匹配的变量?
值太多:
>>> one,two = [1,2,3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
Run Code Online (Sandbox Code Playgroud)
可以忽略
>>> one,two,*_ = [1,2,3,4]
>>>
Run Code Online (Sandbox Code Playgroud)
注意:“扩展可迭代解包”仅从 Python 3 开始。关于下划线。
数据太少/变量多的相反情况如何:
>>> one,two,three = [1,2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
>>>
Run Code Online (Sandbox Code Playgroud)
被处理,特别是以便分配剩余的变量None(或其他值)?
像这样的东西:
>>> one,two,three = [1,2] or None
Traceback …Run Code Online (Sandbox Code Playgroud) 我经常对Python的可迭代解包缺乏灵活性感到沮丧.
请看以下示例:
a, b = range(2)
Run Code Online (Sandbox Code Playgroud)
工作良好.正如预期的那样a包含0和b包含1.现在让我们试试这个:
a, b = range(1)
Run Code Online (Sandbox Code Playgroud)
现在,我们得到一个ValueError:
ValueError: not enough values to unpack (expected 2, got 1)
Run Code Online (Sandbox Code Playgroud)
不理想,当期望的结果是0在a和None中b.
有很多黑客可以解决这个问题.我见过的最优雅的是:
a, *b = function_with_variable_number_of_return_values()
b = b[0] if b else None
Run Code Online (Sandbox Code Playgroud)
不漂亮,可能会让Python新手感到困惑.
那么最恐怖的方式是什么?将返回值存储在变量中并使用if块?该*varname黑客?别的什么?
我经常对Python的可迭代解包缺乏灵活性感到沮丧.请看以下示例:
a, b = "This is a string".split(" ", 1)
Run Code Online (Sandbox Code Playgroud)
工作良好.正如预期的那样a包含"This"和b包含"is a string".现在让我们试试这个:
a, b = "Thisisastring".split(" ", 1)
Run Code Online (Sandbox Code Playgroud)
现在,我们得到一个ValueError:
ValueError: not enough values to unpack (expected 2, got 1)
Run Code Online (Sandbox Code Playgroud)
不理想,当期望的结果是"Thisisastring"在a和None或更好,但""在b.
有很多黑客可以解决这个问题.我见过的最优雅的是:
a, *b = mystr.split(" ", 1)
b = b[0] if b else ""
Run Code Online (Sandbox Code Playgroud)
不漂亮,并且对Python新手来说非常困惑.
那么最恐怖的方式是什么?将返回值存储在变量中并使用if块?该*varname黑客?别的什么?
python ×8
python-3.x ×4
arrays ×1
exception ×1
list ×1
return-value ×1
split ×1
string ×1
unpack ×1