2016-12-11 4 views
0

Gegeben eine Liste von Eingaben. Das letzte x der Liste ist eine Zahl, die ich für einen Test verwenden möchte. Also sind die n-x-Anfangselemente diejenigen, die ich mit den Elementen in x testen möchte.While-Schleife beendet Python nicht

Zum Beispiel:

test_case = [0.18677649597722776, 0.21992417009282958, 0.21001370207789635, 0.2576939078119566, -0.26790678064174844, 0.23723906040549575, 0.23796810219833633, 0.12311570730540798, 0.291222989748139, -0.46589179980005796, -0.5679935337540711, -0.541967302717414, 0.2797199715268191, -0.0462338707795437, 0.3352382038488532, -0.6395453091791992, -0.7116194799285872, -0.6827853559995019, 0.4131897184013285, 0.07125041194386302, 0.47179441094288416, -0.5670171363969451, -0.6493889334859158, -0.6214861349381114, 0.6332084272531783, 0.2946607775328391, 0.7252115985158697, -0.48494480580385074, -0.5584250339723696, -0.5329318548632481, 0, 1, 0, 5, 5, 5] 

Die letzten 6 Zahlen, die ich im Rahmen meiner Prüfung auf den ersten 30 Nummern verwenden möchten. Ich möchte durch die 30 Zahlen so, dass, wenn test_case[31] < 3, geben Sie mir test_case[0], sonst geben Sie mir -999. Dies iteriert bis test_case[36] < 3, geben Sie test_case[5]. Dann möchte ich test_case[31] zurück gehen und auf test_case[6] wieder verwendet werden und Schleife.

Nachdem ich bei test_case[30] bin, möchte ich es stoppen.

Hier ist, was ich habe:

def test_inputs(x, comp_size): 
    counts = x[-comp_size:] 
    inputs = x[:(len(x)-comp_size+1)] 
    counts_pos = 0 
    inputs_pos = 0 
    while inputs_pos < (len(x)-comp_size+1): 
     if counts_pos == 6: 
      counts_pos = 0 
     if counts[counts_pos] < 3: 
      x.append(inputs[inputs_pos]) 
      print inputs_pos 
      print counts_pos 
      inputs_pos += 1 
      counts_pos += 1 
     else: 
      x.append(-999) 
      print inputs_pos 
      print counts_pos 
      inputs_pos += 1 
      counts_pos += 1 

Ich versuche, eine verallgemeinerte Funktion zu machen. In diesem Fall sollte laufen können:

test_inputs(test_case, 6) 

Dies ist jedoch bei inputs_pos == 31 nicht stoppen. Ich gebe Druckanweisungen ein, und es sieht so aus, als würde es einfach weitergehen.

Gibt es einen einfacheren Weg mit einem Filter?

+0

Ihre Schleifenbedingung hängt von len (x) ab, aber Sie fügen bei jeder Iteration durch die Schleife ein Element an x ​​an, so dass len (x) immer größer wird. – jarmod

+0

Das war's, danke !! – WhitneyChia

Antwort

3

Bin ich richtig zu verstehen, dass Sie wollen:

from itertools import cycle 
def test_inputs(x, comp_size): 
    return [(input if count<3 else -999) for (input,count) 
      in zip(x[:-comp_size], cycle(x[-comp_size:]))] 

Sie können mit x.extend statt return des direkten Modifikation Verhalten wiederherzustellen. Da die Slices vor dem Extend-Aufruf ausgeführt werden, werden die exakt gleichen Elemente erzeugt. Dennoch glaube ich nicht, dass es generell eine gute Idee ist, Datentypen in einer Liste wie dieser zu mischen, wenn es so einfach wäre, (inputs,counts) Tupel zu bestehen.

0

Die Schleife wird nicht gestoppt, da len(x) bei jeder Iteration ausgewertet wird. In Ihrem Zyklus erhöhen Sie count_pos und fügen ein neues Element an x an.

+0

Danke ... dummer Fehler. – WhitneyChia