【问题标题】:Trying to write a function but int object is not iterable尝试编写函数但 int 对象不可迭代
【发布时间】:2021-01-22 07:50:06
【问题描述】:

我目前正在尝试编写一个接受整数列表、低整数和高整数的函数。然后它将返回整数列表中位于低整数和高整数范围内的值的平均值。

这方面的一个例子可能是get_average_in_range([1, 5, 6, 7, 9], 5, 7),答案返回为 5.5,因为只有 5 和 6 在 5(包括)和 7(不包括)的范围内,而 5 和 6 的平均值是 5.5

我目前收到'int' object is not iterable 的错误

到目前为止,这是我的代码:

def get_average_in_range(list, low, high):
    min_val = min(low)
    max_val = max(high)
    range = range(min_val, max_val)
    sum_num = 0
    for number in range(range):
        sum_num = sum_num + x
    avg = sum_num / len(list)
    print(avg)

【问题讨论】:

  • 你用 int 掩盖了range
  • 能否分享一下你是如何调用函数的,我们对数据类型一无所知
  • @Tuqay 编辑了操作
  • 您使用range = range(min_val, max_val) 破坏了范围函数。避免将变量命名为与内置函数和类型相同。
  • @JustinEzequiel 我该如何解决这个问题?只是重命名range

标签: python


【解决方案1】:

minmax 函数都采用可迭代对象,并且您将整数传递给它们,这就是错误的原因。此外,您正在为变量使用关键字,如果不重命名它们会出错。

你的算法有太多问题,我会尝试修复它们,而不会完全破坏你的代码。

def get_average_in_range(my_list, low, high): # list is keyword, changed it to my_list
    #  min_val = min(low) - no need for these two lines, low and high are already low and high
    #  max_val = max(high)
    my_range = range(min_val, max_val) # range is keyword, so I changed it to my_range

    sum_num = 0
    counter = 0 # for keeping count of numbers in range. 

    for number in my_range: # my_range is a range object, we use it

        count = my_list.count(number)  # getting how many times number is present in my_list
        counter += count  # increasing counter
        sum_num += count # number #inc
    avg = 0.0
    if counter != 0:  # if counter is 0, we keep average as it is
        avg = sum_num / counter # all we need is counter
    print(avg)

其实这不是最好的方式,这是一种糟糕的方式。我们可以优化它:

def get_average_in_range(my_list, low, high):
    sum_num = counter = 0
    for number in my_list:  
        if low <= number < high:
            counter += 1
            sum_num += number 
    avg = 0.0
    if counter != 0:  
        avg = sum_num / counter 
    print(avg)

这里的逻辑是检查my_list中的每个数字,看它是否在范围内。

【讨论】:

  • 哦,这完全有道理。但是,我现在没有通过几个测试用例,其中一个我必须通过函数通过(-204, 5) 以及Returns 0 when given 0。我不确定如何解决其中任何一个问题。你有什么想法吗?
  • 我错过了这一点,当范围内没有数字时,它必须返回0
  • 嗯。我该如何更改?
【解决方案2】:

错误原因:

Min 和 max 函数接受列表作为参数。 lowhigh 是数字,但您在以下几行中将它们视为 list

min_val = min(low)
max_val = max(high)

不要隐藏名字:

# `list` is shadowed here. you cannot use `list` anymore.
def get_average_in_range(list, low, high):
    # ...
    # `range` is shadowed here.
    range = range(min_val, max_val)
    for number in range(range): # you tried to use builtin `range` that assigned line above.

计算平均值时出现逻辑错误

您必须划分您选择的项目数,而不是全部。

    avg = sum_num / len(list)

固定版本:

def get_average_in_range(numbers, low, high):
    low_index = numbers.index(low) # find index of 'low', for your example: 1
    high_index = numbers.index(high) # find index of 'high', for your example: 3

    range_sum = 0 # set as 0 since we sum
    
    for i in range(low_index, high_index): # iterate between low and high(exclusive)
        range_sum += numbers[i] # add current number
    
    return range_sum / (high_index-low_index) # divide number of items, for your example: 3-1=2

print(get_average_in_range([1, 5, 6, 7, 9], 5, 7))

【讨论】:

  • 哇,谢谢!你知道我怎么能做到,所以我可以在这里传递负值吗?此外,我没有通过读取Returns 0 when given 0 的测试用例。你知道为什么会这样吗?
【解决方案3】:

这是pythonic的做事方式:

def get_average_in_range(lst, low, high):
    
    filtered_lst = [elem for elem in lst if elem >= low and elem <= high]
    return sum(filtered_lst) / len(filtered_lst)

请不要使用python的关键字listrange作为变量。

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2010-12-28
    • 2013-08-02
    • 2012-06-21
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多