【问题标题】:Can't create a random list that calculates the longest distance between its elements无法创建一个随机列表来计算其元素之间的最长距离
【发布时间】:2022-01-14 16:28:57
【问题描述】:

我不知道为什么会出现此错误:Traceback(最近一次调用最后一次): 第 78 行,在 find_max_gap(x) 第 22 行,在 find_max_gap 中 vmin = x[0] TypeError: 'int' 对象不可下标

我是 Python 新手,因此很难跟踪我所犯的错误。我一直在试图弄清楚一整天发生了什么

用户输入参数并创建一个随机列表,计算其元素之间的最长距离。

import random

def generate_random_floats(n,m,seed):
    x = []
    if (y==0):
        random.seed()
        for i in range (n):
            x.append(random.uniform(-m,m))
    else:
        random.seed(y)
        for i in range (n):
            x.append(random.uniform(-m,m))
    return x
    pass
    # function that returns a list of n random numbers in span
    # -m, m with seed generator of random numbers (optional argument)
    
def find_max_gap(x):
    vmin <= x[0]
    dmax = 0
    for i in range (n):
        if (x[i] < vmin):
            vmin = x[i]
        elif (x[i] - vmin > dmax):
            dmax = x[i] - vmin
    return (dmax)
    
    # function that accepts a list of real numbers and returns the maximum distance between them
    pass

def present_list():
    print(" The random list is:",generate_random_floats(n,m,seed))
    # auxiliary function that prints the elements of a list
     pass

n=-1
while n < 0 or n == 0 :
    while True:
        try:
            # user input of how many random numbers
            n = int(input(">>Define the number (n) from the random numbers.\n-Positive number) :"))
            break
        except:
            continue
m=-1
while m < 0 :
    while True:
        try:
            # input user -m, m
            m = int(input(">>Define (range) from which random values will be selected.\n) :"))
            break
        except:
            continue
seed=0
b=0
x=0
s=0
while True:
    try:
        # input seed
        y = int(input("Enter the number that will set the seed value. :"))
        break
    except:
        continue
# create list of random numbers
generate_random_floats(n,m,seed)
present_list()
find_max_gap(x)   

【问题讨论】:

  • 在函数“generate_random_floats”中使用 y 而不是种子是不是错字?
  • 我不这么认为。我更改了它,但仍然收到此消息。
  • edit你的问题显示完整的错误信息。
  • 小注:1) while n &lt; 0 or n == 0 : 是一种缓慢/冗长的拼写while n &lt;= 0: 的方式。 2) 从不 使用一个裸露的except:,它在完成时不会重新raise 异常。当然,您可能希望忽略用户错误并再次询问,但即便如此,请使用except Exception:,这样您就不会在用户按下 Ctrl-C 强制退出程序或按下 Ctrl-D 时忽略它结束输入,但你只是一直提示它们。

标签: python list random


【解决方案1】:

当您在代码中定义 x = 0 时,您希望它将它传递给您的函数,因为它被隐式地视为全局变量。

然后在函数generate_random_floats 中,您认为您正在修改x,而实际上该函数中的x 与您全局范围内的x 不同。

之后,在您调用find_max_gap 期间,vmin &lt;= x[0] 行中的x 仍然是一个 int(并且等于 0)。尝试像矢量 (x[0]) 一样访问 x 会引发错误。

在您的代码中需要修改一些内容,以便它执行您想要的操作:

  1. 我会将您的执行脚本封装在if __name__ == "__main__": 中(有关详细信息,请参阅What does if __name__ == "__main__": do?)。
  2. 我会避免以全局方式使用变量。而不是像 generate_random_floats(n,m,seed) 这样调用你的函数,我会明确地使用函数的返回来分配变量:x = generate_random_floats(n,m,seed)
  3. 以同样的方式传递x 作为present_list() 函数的输入变量
  4. 我还会更正您对 seedy 的使用(在执行脚本和函数中)

如果您的代码太难理解,我稍后会提供更正。

编辑:更正的代码

import random

def generate_random_floats(n,m,seed):
    x = []
    if (seed==0):  # modified y => seed
        random.seed()
        for i in range (n):
            x.append(random.uniform(-m,m))
    else:
        random.seed(y)
        for i in range (n):
            x.append(random.uniform(-m,m))
    return x
    # function that returns a list of n random numbers in span
    # -m, m with seed generator of random numbers (optional argument)
    
def find_max_gap(x):
    vmin = x[0] #corrected assignation
    dmax = 0
    for i in range (n):
        if (x[i] < vmin):
            vmin = x[i]
        elif (x[i] - vmin > dmax):
            dmax = x[i] - vmin
    return dmax
    # function that accepts a list of real numbers and returns the maximum distance between them


def present_list(x):
    print(" The random list is:", x) # replaced the function call with x
    # auxiliary function that prints the elements of a list


if __name__ == "__main__":
    n=-1
    while n < 0 or n == 0 :
        while True:
            try:
                # user input of how many random numbers
                n = int(input(">>Define the number (n) from the random numbers.\n-Positive number) :"))
                break
            except:
                continue
    m=-1
    while m < 0 :
        while True:
            try:
                # input user -m, m
                m = int(input(">>Define (range) from which random values will be selected.\n) :"))
                break
            except:
                continue
    seed=0
    while True:
        try:
            # input seed
            seed = int(input("Enter the number that will set the seed value. :")) # replaced y with seed
            break
        except:
            continue
    # create list of random numbers
    rfloats = generate_random_floats(n,m,seed) #generate new list rfloats
    present_list(rfloats) 
    mgap = find_max_gap(rfloats) 

    print("The max gap is :", mgap)

【讨论】:

  • 非常感谢您的回答!正如我所说,我是 Python 新手,所以我很难理解你写的所有东西。我试图纠正你提到的一些事情,但我不确定我是否走在正确的道路上。
  • 我很想看到你的更正,我还在为代码而苦恼。
  • 我在编辑中添加了代码,我只是更正了代码以便它运行(请参考其他cmets进行改进)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多