如果太短,是否自动将 Python 列表扩展到 N 个元素?

Ric*_*lon 22 python list

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)

  • 根据 `None` 的数量,我更喜欢 `x, y, z, *_ = s.split() + [None] * 3` - 它有数字就在那里,这会更具可读性对于较大的数字,可以更轻松地进行参数设置并且启动时间更短。 (7认同)
  • 如果你想去掉`*_`,可以写成`x, y, z = (s.split() + [None]*3)[:3]` (4认同)

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 列表。


Igu*_*don 7

这种应用程序正是其中的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 个元素。


kay*_*ya3 5

这是一个使用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, _), *_改为使用解构。

  • 你可以这样做: x,y, z = (k for k, _ in zip_longest(s.split(), range(3))) (2认同)

归档时间:

查看次数:

2565 次

最近记录:

5 年,11 月 前