N如果列表少于元素,Python 中自动将列表扩展到元素的最佳方法是什么N?
也就是说,让我们有我有这个字符串:s = "hello there"。如果我这样做:
x, y, z = s.split()
Run Code Online (Sandbox Code Playgroud)
我会得到一个错误,因为s.split()返回一个包含两个元素的列表,但我将它分配给 3 个变量。我想要的是z被分配None。
我知道我可以通过艰难的方式做到这一点:
l = s.split()
while len(l) < 3:
l.append(None)
x, y, z = l
Run Code Online (Sandbox Code Playgroud)
但必须有比这更优雅的东西。
Dan*_*ejo 23
如果你想要一个单线,请执行以下操作:
s = "hello there"
x, y, z, *_ = s.split() + [None, None, None]
print(x, y, z)
Run Code Online (Sandbox Code Playgroud)
输出
hello there None
Run Code Online (Sandbox Code Playgroud)
请注意,单行不一定更易读,也不一定更优雅。感谢@Grismar,一个变化是:
x, y, z, *_ = s.split() + [None] * 3
Run Code Online (Sandbox Code Playgroud)
Ste*_*lla 14
extend 在列表末尾添加一个可迭代对象,因此您可以执行以下操作:
l.extend(None for _ in range(3 - len(l))
Run Code Online (Sandbox Code Playgroud)
或者
l.extend([None]*(3-len(l)))
Run Code Online (Sandbox Code Playgroud)
这更优雅,但速度稍慢,因为它需要首先构造 Nones 列表。
这种应用程序正是其中的padnone配方的itertools用途(https://docs.python.org/3/library/itertools.html#itertools-recipes):
x, y, z = itertools.islice(itertools.chain(s.split(), itertools.repeat(None)), 3)
Run Code Online (Sandbox Code Playgroud)
上面还包含take了 3 个元素。
这是一个使用itertools.zip_longest的温和有趣的解决方案:行为是None用来填充较短序列中缺失的元素。
from itertools import zip_longest
(x, _), (y, _), (z, _) = zip_longest(s.split(), range(3))
Run Code Online (Sandbox Code Playgroud)
与您的原始代码一样,如果s.split()超过三个部分,这将引发错误。如果您更喜欢默默地丢弃多余的部分,请(x, _), (y, _), (z, _), *_改为使用解构。
| 归档时间: |
|
| 查看次数: |
2565 次 |
| 最近记录: |