2016-07-31 9 views
-3

Ich brauche die Werte in l1 um einige Prozent „Crush“ zu tun ist, so dass sie näher zusammen sind, so dass vielleicht, wenn ein Array l1 waren ...Bringen Sie alle Werte in einem Array näher zusammen

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

Dann l2 könnte ...

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

, die auf einem einfachen Skript getan werden kann, wie zum Beispiel ...

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) 

Das bedeutet also, dass ich alle Elemente näher zusammen bringen muss - idealerweise um einige Prozent (gedruckt). Das Problem tritt auf, wenn Sie eine Liste wie diese haben ...

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

Was muß ich dann alle Einzelteile zusammen diskret tut, ist zu bringen (so um einige Prozent), aber in einer Schleife. Ich muss die Werte des Arrays "verdichten" oder "zerquetschen", den Bereich zwischen jeder Zahl vom kleinsten zum größten und größten zum kleinsten (näher zum Median) verringern. Ich kann nicht einfach durch die ganze Liste dividieren, da die Bereiche gleich bleiben.

Ich dachte, eine Möglichkeit, dies zu erreichen (woran ich gerade arbeite) wäre, (a) den Median von l1 zu finden, (b) vom kleinsten und größten Element in l1 zu beginnen, dieses Element um 10 zu erhöhen % des Wertes oder verringern Sie ihn um 10% seines Wertes (im Fall des größten Elements), dann arbeiten Sie mit dem zweitkleinsten und größten Element in der gleichen Schleife (um zu vermeiden, dass das Skript zweimal dieselbe 'kleinere Variable' durchläuft)).

Dies würde bedeuten, die Werte vom größten zum kleinsten aufzulisten, während ihre Positionen im Array beibehalten werden (was wichtig ist), dann durch diese Liste zu suchen und die Änderungen für jeden entsprechenden Wert zum Array l1 vorzunehmen.

Für die Aufmerksamkeit der vorgeschlagenen Lösung ... Eine Wiederholung von ...

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

mir gibt, was ich brauche, irgendwie ...

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

Output ist Listen in Listen ! Gibt es eine einfache Möglichkeit, dies zu beseitigen, indem Sie die Funktion neu schreiben?

+2

Ich verstehe nicht, wie Sie 'l2' von' l1' oben berechnen. Zum Beispiel, warum bleibt '2'' 2'? – pts

+3

Sie können eine Antwort leichter erhalten, wenn Sie klären, welche Eigenschaften eine gute Lösung haben muss. Zum Beispiel, was ist los mit dieser einfacheren Lösung: 'l2 = [x * 0.01 für x in l1]'? – pts

+2

Wenn Ihre Anwendung einen Fehler aufweist, können Sie den Fehler beheben, anstatt zu versuchen, die Eingabewerte zu umgehen. – pts

Antwort

2

Nur in Richtung Median skalieren?

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

Habe dieses Modul noch nicht einmal installiert. Lass mich sehen, wie das mit den Daten klarkommt. – mmacheerpuppy

+0

@mmacheerpuppy Es wurde in Python 3.4 eingeführt, also vielleicht Zeit zu aktualisieren? :-). Oder tun Sie es einfach selbst, siehe [Quellcode] (https://hg.python.org/cpython/file/3.5/Lib/statistics.py#l337). Oder wenn Sie den Mittelwert anstelle des Median verwenden können, ist das natürlich noch einfacher. –

+0

Danke dafür! Funktioniert für einige Datenmengen, aber nicht für komplexere Datenmengen (am Ende wird jede Zahl mit dem Mittelwert/Median gleichgesetzt. Gibt es eine Möglichkeit, nur die größten/kleinsten Zahlen im Array anzusprechen? – mmacheerpuppy

0

Warum finden Sie nicht die niedrigste Nummer in Ihrer Liste und teilen Sie die ganze Liste durch diese Nummer? Oder sogar irgendeine Zahl, die du willst.

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

Verwenden min() die niedrigste Zahl der Liste zu finden, wenn Sie diesen Weg gehen möchten.

+0

Leider funktioniert das nicht. Ich muss entweder vom größten und kleinsten zum Median nach innen kriechen oder vom Median ausgehen und nach außen kriechen. Ich dachte, es wäre einfacher, das erstere zu tun. Ich habe den Beitrag zur besseren Veranschaulichung aktualisiert. – mmacheerpuppy

Verwandte Themen