如何构造第i个元素恰好出现i次的Python列表
问题解答
错误原因说明
- 首次写法问题:你使用的单层列表推导仅遍历
range(n)的每个元素1次,自然只能得到每个数字仅出现1次的序列。另外需要注意range(n)默认从0开始计数,如果直接使用会生成包含0的错误结果,需要指定起始值为1。 - 第二次写法问题:
[x] * x会为每个数字x生成独立的子列表,extend方法会将每个子列表作为独立元素插入总列表,最终就会得到嵌套列表的不符合预期结果。
正确实现方案
方案1:双层列表推导(最简洁)
直接在列表推导中加第二层循环控制重复次数,自动生成平铺结构:
n = 5 # 可替换为你需要的数值 rules = [x for x in range(1, n+1) for _ in range(x)]
运行后rules结果为[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5],完全符合需求。
方案2:嵌套列表扁平化(适配你第二次的写法逻辑)
如果你想要保留生成子列表的逻辑,可以用itertools.chain将嵌套列表扁平化:
from itertools import chain n = 6 rules = list(chain.from_iterable([x] * x for x in range(1, n+1)))
运行后rules结果为[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6]。
内容的提问来源于stack exchange,提问作者ilya jung
相关产品推荐
相关产品推荐

