创建重复 N 次的单个项目的列表

新手上路,请多包涵

我想创建一系列长度各不相同的列表。每个列表将包含相同的元素 e ,重复 n 次(其中 n = 列表的长度)。

如何在不对每个列表使用列表理解 [e for number in xrange(n)] 的情况下创建列表?

原文由 chimeracoder 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 625
2 个回答

你也可以这样写:

 [e] * n

您应该注意,如果 e 是一个空列表,您会得到一个包含 n 个对同一列表的引用的列表,而不是 n 个独立的空列表。

性能测试

乍一看,repeat 似乎 是创建具有 n 个相同元素的列表的最快方法:

 >>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819

但是等等——这不是一个公平的测试……

 >>> itertools.repeat(0, 10)
repeat(0, 10)  # Not a list!!!

函数 itertools.repeat 实际上并没有创建列表,它只是创建了一个对象,如果你愿意,它可以用来创建列表!让我们再试一次,但转换为列表:

 >>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233

因此,如果您想要一个列表,请使用 [e] * n 。如果您想延迟生成元素,请使用 repeat

原文由 Mark Byers 发布,翻译遵循 CC BY-SA 4.0 许可协议

>>> [5] * 4
[5, 5, 5, 5]

当重复的项目是列表时要小心。该列表不会被克隆:所有元素都将引用同一个列表!

 >>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]

原文由 new name 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题