2015-12-09 179 views
2

「返回整數列表的」居中「平均值,除了忽略列表中的最大值和最小值之外,我們將這些列表中的平均值取平均值。有最小值的多個副本,忽略一個副本,同樣也是最大的值,使用整數除法來產生最終的平均值,你可以假定列表長度爲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] 
+2

你可以做'MAX()'和'分鐘()',如果他們是在一個列表 –

+0

是啊,該代碼的走位。 'y'的計算是奇怪的 - 它只是計算'len(nums)' - 但是一旦你有'y',那絕對是一箇中位數。 – user2357112

+0

大聲笑,我可以理解,現在我看着它很奇怪,我很新,所以我發現自己一直在做這種奇怪的廢話,看看它是否有效xD – SleBluue

回答

4

排序陣列是肯定更簡潔代碼,這裏是用手動迴路

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) 

這只是增加了一切並去除最大值和最小值在端部的替代方案。

+0

這比排序更好。你的解決方案是O(n),而排序是O(n log n)。 –

0

如果列表不是太長,它不應該過於昂貴的計算對列表進行排序:

sorted(nums) 

然後你就可以創建一個新的列表,而第一個和最後一個項目,這將是最小值和最大值:

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

如果我理解這個問題,這應該工作:

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

在我開始之前,我知道在使用函數排序的其他答案中提到了更簡單的方法,是的,但是我相信你的老師必須讓你能夠掌握循環並在邏輯上使用它們。

首先選擇你的第一個號碼,並將其分配到高和低,不要擔心它會有意義之後。

高清中心平均(NUMS):

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

這裏是人的奇蹟發生了,你遍歷你的清單,如果你在環數越多,則以前的話可以更換隨着它變高,讓我示範。

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

現在你有低和高你要做的就是通過LEN加循環的值加在一起減去高和低(如你所說,你並不需要它們)。然後除以答案NUMS。

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

謝謝!在我使用捷徑之前,我絕對想完全理解所有事情! – SleBluue

+0

這很好,但您可以在一個循環中完成所有操作,並在最後減去高和低。不要忘記減少2的數量。 – Dave

+0

@DaveGalvin我不認爲我會減去長度減去2,因爲我將它們減掉了。如果我要減少len,那麼我會錯過其他兩個元素。然而,在一個循環中做它更有效,但我想用分開的步驟將它解釋給OP,因爲我發現它是學習的最佳方式。 –

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) 
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