2016-07-31 21 views
-3

我需要做的是「美眉」在一定的百分比在L1值,使他們更接近在一起,這樣也許如果數組L1是...將所有值在數組靠得更近

l1 =[10,20,30,40,50,60,70,80,90,100] 

然後L2 可能是...

l2 = [12.5, 25.0, 37.5, 50.0, 62.5, 45.0, 52.5, 60.0, 67.5, 75.0] 

可以在一個簡單的腳本來實現,如...

for i in l1: 
    if i <= 50: 
     i = (i*1.25) 
     l2.append(i) 
     print(i) 
    elif i >= 50: 
     i = (i*0.75) 
     l2.append(i) 

print (l2) 

所以這就表明我需要把所有的東西放在一起 - 理想情況是用百分位(印刷)。當你有像這樣的列表將出現問題...

l1 =[4,2,3,4,3,6,4,8.6,10,7,12,4,14,15,26,14,15,16,10] 

我需要再做的是(所以一定的百分比),但在一個循環中把所有的物品放在一起離散什麼。我需要「壓縮」或「壓碎」數組的值,將每個數字之間的範圍從最小到最大以及從最大到最小(更接近中位數)。由於範圍保持不變,我不能將整個列表分開。我認爲一種解決這個問題的方法是(a)找到l1的中位數,(b)從l1中最小和最大的項目開始,將該項目增加10它的價值的百分之一或減少它的價值的10%(在最大項目的情況下),然後在同一循環中工作到第二小和最大的項目(以避免腳本兩次通過同一個「小變量」 )。

這將意味着上市從大到小的值,同時保持自己的陣列中的位置(這很重要),然後通過該列表搜索,以及爲每個對應值的陣列L1的變化。

對於提出的解決方案的關注......的一個迭代...

import statistics 
a = [4, 3, 3, 4, 5, 1, 31, 321] 
input_scope = 1.1 

def scouter (input_list, scope): 
    mean = statistics.mean(input_list) 
    searchpositions = [] 
    for x, i in enumerate(input_list): 
      print (x, i) 
      if i == max(input_list) or i == min(input_list): 
       searchpositions.append(x) 

    for i in searchpositions: 
     input_list[i] = [(input_list[i] - mean)/scope + mean] 
    return (input_list) 
print(scouter((a), input_scope)) 

給我我需要什麼樣的,...

[4, 3, 3, 4, 5, [5.13636363636364], 31, [296.0454545454545]] 

輸出是在列表清單!有沒有簡單的方法通過重寫函數來消除這種情況?

+2

我不明白你如何從'l1'上面計算'l2'。例如,爲什麼'2'仍然是'2'? – pts

+3

如果您澄清一個好的解決方案需要具備哪些屬性,則可以更輕鬆地得到答案。例如,這個更簡單的解決方案有什麼問題:'l2 = [x1.01 for x in l1]'? – pts

+2

如果您的應用程序存在錯誤,則可能需要修復該錯誤,而不是嘗試解決輸入值問題。 – pts

回答

2

剛剛向中位數?

>>> l1 = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

>>> import statistics 
>>> median = statistics.median(l1) 
>>> [(x - median)/10 + median for x in l1] 
[50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5] 
+0

甚至沒有安裝此模塊。讓我看看這是如何處理數據的。 – mmacheerpuppy

+0

@mmacheerpuppy它是在Python 3.4中引入的,所以也許有時間更新? :-)。或者只是自己做,請參閱[源代碼](https://hg.python.org/cpython/file/3.5/Lib/statistics.py#l337)。或者如果你可以使用平均值而不是中位數,那當然更簡單了。 –

+0

感謝!適用於某些數據集,但不適用於更復雜的數據集(最終結果是每個數字最終與平均值/中值相等)有沒有辦法只針對數組中的最大/最小數? – mmacheerpuppy

0

爲什麼不找清單中的最低數,由數把整個名單?甚至任何你想要的數字。

num = percentage/100 # gets you a decimal 
l2 = [x*num for x in l1] 

使用min()找到,如果你想一直這樣下去的最低數量之列。

+0

不幸的是,這不起作用。我需要從最大和最小向中間向內蠕動,或者從中位開始並向外爬行。我認爲做前者會更容易。我已更新該帖子以更好地說明。 – mmacheerpuppy