2017-01-19 3 views
0

Ich habe eine Liste von Zahlen wieBedingtes Extrakt Zahlen aus Python Liste

20 
40 
45 
60 
80 

Das mag ich zum Beispiel sagen zu können, wird den durchschnittlichen Abstand zwischen den Zahlen < 50 12,5 ist.

import numpy as np 
from sys import argv 
script, pos_file, output = argv 
positions = [] 
with open(pos_file) as f: 
    for x in f: 
     assert x.strip().split() 
     positions.append(x) 

position_list= [] 

for x in positions: 
    if x < 50: 
     position_list.append(x) 

print np.mean[position_list] 

das funktioniert nicht - ich glaube, weil, wenn ich die Positionen Liste drucke ich 20,40,45,60,80 bekommen - so denke ich, es ist nicht die Zahlen als einzelne Zahlen Behandlung von daher kann es nicht testen wenn x < 50. Was mache ich falsch?

EDIT: sieht aus wie die Daten eher von Zeilen wie gemacht wird:

467,1977,3751,4013,5752,6406,6446,7362,7585,8285,8624,8741,‌​9143,9304,11879,1319‌​7,13460,14401,14785,‌​15117,22264,23714,24‌​294,24534,26053,2695‌​9,27714,29462,35342,‌​36538,36612,37031,39‌​093,42281,42967,4394‌​5 

Antwort

0

Es gibt ein paar Fehler im Code sind, darauf andere Antworten, die, aber ich glaube, ich es für Sie in eine viel sauberen Weise umschreiben soll:

with open(pos_file) as f: 
    positions = [int(x) for line in f for x in line.strip().split(',') if int(x) < 50] 

print(sum(positions)/len(positions)) 
  • Sie brauchen nicht numpy zu Berechnen Sie eine mean, das ist keine Raketenwissenschaft
  • die assert Anweisung ist nutzlos. Wenn eine Zeile leer ist, gibt split() eine leere Liste zurück, kein Problem für das Listenverständnis.
  • die hinzugefügt Doppel-Loop ermöglicht es auf der gleichen Linie mehrere ganze Zahlen zu lesen
  • keine verschwendete Speichernummern zu speichern, wenn Sie nur die niedrigsten diejenigen
  • Vorteil Feedback auf eine der Antworten nahm behalten wollen, um herauszufinden, dass die Liste durch Kommas getrennt ist. Jetzt erkenne ich, dass das csv Modul hätte verwendet werden können.

so csv Lösung:

import csv 
with open(pos_file) as f: 
    cr = csv.reader(f) 
    positions = [int(x) for row in cr for x in row if int(x) < 50] 

print(sum(positions)/len(positions)) 
1

Es gibt mehrere Dinge falsch mit Ihrem Code:

  • Sie nicht konvertieren sie ein zu int oder float;
  • verwenden Sie np.mean[..] anstelle von np.mean(..) und np.mean ist nicht skriptfähig.

Die Lösung lautet:

import numpy as np 
from sys import argv 
script, pos_file, output = argv 
positions = [] 
with open(pos_file) as f: 
    for x in f: 
     assert x.strip().split() 
     positions.append(int(x)) 

position_list= [x for x in positions if x < 50] 

print np.mean(position_list) 

EDIT

Basierend auf Ihre Kommentare aber es sieht aus wie Sie eine durch Kommata getrennte Liste füttern:

import numpy as np 
from sys import argv 
script, pos_file, output = argv 
positions = [] 
with open(pos_file) as f: 
    for x in f: 
     positions += (int(i) for i in x.strip().split()) 

position_list= [x for x in positions if x < 50] 

print np.mean(position_list) 

Oder:

import numpy as np 
from sys import argv 
script, pos_file, output = argv 
positions = [] 
with open(pos_file) as f: 
    for x in f: 
     for i in x.strip().split(): 
      positions.append(int(i)) 

position_list= [x for x in positions if x < 50] 

print np.mean(position_list) 

Sie kann auch, wie @ Jean-FrançoisFabre sagt, die Summe und dividieren durch die Anzahl der Elemente verwenden, so:

from sys import argv 
script, pos_file, output = argv 
positions = [] 
with open(pos_file) as f: 
    for x in f: 
     for i in x.strip().split(): 
      positions.append(int(i)) 

position_list= [x for x in positions if x < 50] 

print sum(position_list)/len(position_list) 

In diesem Fall müssen Sie nicht importieren.

+1

Ich würde nicht nur verwenden 'numpy' Mittelwert zu berechnen. Tun Sie einfach 'sum (position_list)/len (position_list)' Sie benötigen kein zusätzliches Modul. und was benutzt 'assert x.strip(). split()'? (abgesehen davon, dass man 'Positionen' nicht einfach in einem Listenverständnis lesen kann –