You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,之前两次尝试均运行报错:

  1. 第一次尝试代码如下,运行报错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()方法。

  1. 第二次尝试代码如下,运行报错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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:01:40