找到"居中的平均值"列表

时间:2015-12-09 16:41:59

标签: python algorithm

"返回"居中"整数列表的平均值,我们将说的是值的平均值,除了忽略列表中的最大值和最小值。如果存在最小值的多个副本,则只忽略一个副本,同样为最大值。使用整数除法生成最终平均值。您可以假设列表长度为3或更长。"

这是我在家庭作业中遇到的一个问题,我很难找到如何找到最大/最小的数字并将它们从列表中删除。这是我到目前为止所拥有的。它适用于10/14我必须通过的场景..我认为这只是因为它抓住了中位数

def centered_average(nums):
x = 0
for i in range(len(nums)):
    x = i + 0
y = x + 1
if y%2 == 0:
    return (nums[y/2] + nums[(y/2)+1]) / 2
else:
    return nums[y/2]

13 个答案:

答案 0 :(得分:5)

对数组进行排序肯定是更简洁的代码,这里是手动循环的替代方法

    max_value = nums[0]
    min_value = nums[0]
    sum = 0
    for x in nums:
        max_value = max(max_value, x)
        min_value = min(min_value, x)
        sum += x

    return (sum - max_value - min_value) / (len(nums) - 2)

这只会添加所有内容并删除最后的最大值和最小值。

答案 1 :(得分:1)

如果列表不是太长,则对列表进行排序的计算成本不会太高:

sorted(nums)

然后你可以创建一个没有第一个和最后一个条目的新列表,它将是最小和最大的值:

new_nums = sorted(nums)[1:-1] # from index 1 to the next-to-last entry

答案 2 :(得分:1)

在开始之前,我知道使用函数排序在其他答案中提到了更简单的方法,是的,这是真的,但我相信你的老师必须让你能够掌握循环并在逻辑上使用它们。

首先选择您的第一个号码并将其指定为高低,不要担心以后会有意义。

def center average(nums):

high = nums[0]
small = nums[0]

这是神奇的事情,你循环浏览你的列表,如果你在循环中的数字大于先前的数字那么你可以用它替换变量high,让我演示。

for count in nums:
    if count > high:
        high = count
    if count < low:
        low = count

现在你有低和高你所做的就是将循环的值加在一起减去高和低(正如你所说的那样你不需要它们)。然后将这个答案除以len of nums。

for count in nums:
    sum = count + sum
sum = sum - (high + low)
return sum

答案 3 :(得分:1)

新来的。我喜欢用在互联网上找到的解决方案来检查我的解决方案,但在这里还没有看到我的代码(因此是帖子)。我在 https://codingbat.com/prob/p126968 上发现了这个挑战。这是我的解决方案: ** 这是在 Python 3.9.1 中完成的。

首先使用 index 方法从列表中弹出最小值和最大值。之后只是简单的平均计算。

def centered_average(nums):

  nums.pop(nums.index(max(nums)))
  nums.pop(nums.index(min(nums)))
  
  return sum(nums)/len(nums)

答案 4 :(得分:0)

如果我理解这个问题,这应该有效:

winston.loggers.add('mongoLog',{
    transports : [
        new(winston.transports.MongoDB)({
            db : 'mongodb://xxxxx',',
            collection : 'collection1',
            level : 'info',
            capped : true
        }),
    ]
});

var mongoLog = winston.loggers.get('mongoLog')
mongoLog.info('hello') 


winston.loggers.add('profileLog',{
    transports : [
        new(winston.transports.MongoDB)({
            db : 'mongodb://xxxxx',
            collection : 'collection2',
            level : 'info',
            capped : true
        }),
    ]
});

var profileLog = winston.loggers.get('profileLog')
profileLog.error('user profile is not valid')

答案 5 :(得分:0)

def centered_average(nums):
  nums = sorted(nums)
  for i in range(len(nums)):
    if len(nums)%2 != 0:
      return nums[len(nums)/2]
    else:
      return ((nums[len(nums)/2] + nums[len(nums)/2 - 1]) / 2)

答案 6 :(得分:0)

这是解决问题的非常标准的解决方案。此代码是一个错误的代码,没有考虑任何复杂性和空间的考虑。但我认为要遵循的思维过程类似于代码中的步骤。然后可以改进。

def centered_average(nums):
#Find max and min value from the original list
max_value = max(nums)
min_value = min(nums)
#counters for counting the number of duplicates of max and min values.
mx = 0
mn = 0
sum = 0
#New list to hold items on which we can calculate the avg
new_nums = []
#Find duplicates of max and min values
for num in nums:
  if num == max_value:
    mx += 1
  if num == min_value:
    mn += 1
#Append max and min values only once in the new list
if mx > 1:
  new_nums.append(max_value)
if mn > 1:
  new_nums.append(min_value)
#Append all other numbers in the original to new list
for num in nums:
  if num != max_value and num != min_value:
    new_nums.append(num)
#Calculate the sum of all items in the list
for new in new_nums:
  sum += new
#Calculate the average value.
avg = sum/len(new_nums)

return avg

答案 7 :(得分:0)

def centered_average(nums):
  min1=nums[0]
  max1=nums[0]
  for item in nums:
    if item > max1:
        max1 = item
    if item < min1:
        min1 = item
  sum1=(sum(nums)-(min1+max1))/(len(nums)-2)
  return sum1

答案 8 :(得分:0)

简单解决方案

import os
import yaml
import codecs


def yaml_reader(filepath):
    with codecs.open(filepath, "r", encoding='utf-8') as file_descriptor:
        data = yaml.load_all(file_descriptor)
        return data

def yaml_dump(filepath, data):
    with open(filepath, 'w') as file_descriptor:
        yaml.dump(data, file_descriptor)

if __name__ == "__main__":
    filepath = os.listdir(os.getcwd())
    data = yaml_reader(filepath)
    print data

答案 9 :(得分:0)

  • 使用sum函数对数组求和
  • max和min函数获得最大和最小数

    def centered_average(nums):
        return (sum(nums) - max(nums) - min(nums)) / (len(nums) - 2)
    

答案 10 :(得分:0)

def centered_average(nums):
    sorted_list = sorted(nums)
    return sum(sorted_list[1:-1])/(len(nums)-2)

这将完成工作。

答案 11 :(得分:0)

使用 list.index、list.pop、min 和 max 函数的 Python 3 解决方案。

def solution(input):

    average = 0

    minimum = min(input)
    maximum = max(input)

    input.pop(input.index(minimum))
    input.pop(input.index(maximum))

    average =  round(sum(input) / len(input))

    return average

答案 12 :(得分:-1)

def centered_average(nums):
    maximums = []
    minimums = []
    sum_of_numbers = 0
    length =len(nums) + (len(minimums)-1) + (len(maximums)-1)
    for i in nums:
        if i == max(nums):
            maximums.append(i)
        elif i == min(nums):
            minimums.append(i)
        else:
            sum_of_numbers += i
    if len(maximums)>=2 or len(minimums)>=2:
        sum_of_numbers = sum_of_numbers + (max(nums)*(len(maximums)-1))(min(nums)*(len(minimums)-1))
    return sum_of_numbers / length