Python/Sage获取序列最大值索引 解决set无index报错问题
现有实现
首先是考拉兹序列生成函数,接收输入n返回完整的循环序列:
def f(n): my_list=[] while n not in my_list: my_list.append(n) if n % 2 == 0: n = n / 2 else: n = 3 * n + 1 my_list.append(n) return my_list
调用示例:f(2)返回结果为[2, 1, 4, 2]。
后续实现了遍历1-100范围、输出每个生成序列最大元素的逻辑:
def f_2(i): for i in range (1,101): set_f = set(f(i)) print(max(set_f))
这段代码将列表转为集合后调用max(),运行结果符合预期。
问题描述
现在需要输出所有生成列表中,最大值对应的索引位置。已知遍历range(1,101)时,所有序列的全局最大值为9232,之前两次尝试均运行报错:
- 第一次尝试代码如下,运行报错
set对象没有index属性:
def f_3(i): for i in range (1,101): set_f = set(f(i)) if max(set_f) == 9232: print(set_f.index(9232)) else: pass
报错原因:set是无序的不重复数据结构,不存储元素位置信息,本身不支持index()方法。
- 第二次尝试代码如下,运行报错
function对象没有index属性:
def f_3(i): for i in range (1,101): if max(f(i)) == 9232: print(f.index(9232)) else: pass
报错原因:f是定义的序列生成函数,不是函数返回的列表实例,自然不存在列表的index()方法。
解决方法
核心修正两点:
- 不要将序列转为set,保留原始返回的列表才能查询元素索引
- 每次循环先把
f(i)的返回结果存为独立变量,避免重复调用函数产生额外性能开销,也能直接对这个列表变量做最大值判断、索引查询。
针对需求的可运行代码如下:
def f_3(): target_val = 9232 for i in range(1, 101): current_seq = f(i) if max(current_seq) == target_val: print(current_seq.index(target_val))
注:之前定义的
f_2、f_3都设置了形参i,但循环内部的for i in range()会直接覆盖形参值,这个形参是多余的,定义函数时不需要传入。
如果不需要硬编码最大值9232,要通用输出每个序列自身最大值对应索引,直接调整逻辑即可:
def f_3(): for i in range(1, 101): current_seq = f(i) seq_max = max(current_seq) max_index = current_seq.index(seq_max) print(f"起始值{i}的序列最大值为{seq_max},对应索引{max_index}")
内容的提问来源于stack exchange,提问作者Echo7154
相关产品推荐
相关产品推荐

