Problem ze zrobieniem pętli

0

Cześć,
mam do zrobienia program w ramach studiów (to nie informatyka). Losuję n razy x liczb (za każdym razem bez powtórzeń) z pewnego zakresu (u mnie na razie 49). Program ma zapisywać w n linijkach w pliku wszystkie losowania. Należy policzyć średnią i odchylenie standardowe każdej z kolumn. Problem leży w tym, że nie potrafię zsumować liczb każdej z kolumn dla n przypadków, jedynie dla z góry narzuconej liczby. Nie udaje mi się również zapisać do pliku wyników (średniej i odchylenia). Mam tyle co poniżej. Czy może ktoś podpowiedzieć jak skonstruować pętlę dla sumowania liczb z każdej kolumny? Z góry dziękuję.

from random import randint

def wylosuj():
    a = randint(1,49)
    if a not in y:
        y.append(a)
    else:
        wylosuj()

n=input("Liczba losowań to:")
n=int(n)
print("Liczba losowań to:",n)

suma1=0
suma2=0
suma3=0
suma4=0
suma5=0
suma6=0
s1kwadrat=0
s2kwadrat=0
s3kwadrat=0
s4kwadrat=0
s5kwadrat=0
s6kwadrat=0

for z in range(0,n):

    y=[]

    plik=open('plik.txt','a')

    for x in range (1,6):
        wylosuj()
    else:
            wylosuj()

    plik.writelines(str(y))
    plik.writelines('\n')
    plik.close()
    print(y)
    suma1=(suma1+y[0])
    suma2=(suma2+y[1])
    suma3=(suma3+y[2])
    suma4=(suma4+y[3])
    suma5=(suma5+y[4])
    suma6=(suma6+y[5])
    s1kwadrat=s1kwadrat+(y[0])**2
    s2kwadrat=s1kwadrat+(y[1])**2
    s3kwadrat=s1kwadrat+(y[2])**2
    s4kwadrat=s1kwadrat+(y[3])**2
    s5kwadrat=s1kwadrat+(y[4])**2
    s6kwadrat=s1kwadrat+(y[5])**2



print("Średnia z pierwszej kolumny to:", suma1/n, "a odchylenie standardowe to:",((s1kwadrat/n)-(suma1/n)**2)**(1/2))
print("Średnia z drugiej kolumny to:", suma2/n, "a odchylenie standardowe to:",((s2kwadrat/n)-(suma2/n)**2)**(1/2))
print("Średnia z trzeciej kolumny to:", suma3/n, "a odchylenie standardowe to:",((s3kwadrat/n)-(suma3/n)**2)**(1/2))
print("Średnia z czwartej kolumny to:", suma4/n, "a odchylenie standardowe to:",((s4kwadrat/n)-(suma4/n)**2)**(1/2))
print("Średnia z piątej kolumny to:", suma5/n, "a odchylenie standardowe to:",((s5kwadrat/n)-(suma5/n)**2)**(1/2))
print("Średnia z szostej kolumny to:", suma6/n, "a odchylenie standardowe to:",((s6kwadrat/n)-(suma6/n)**2)**(1/2))
0

Użycie modułu statistics nieco ułatwiło by pracę (biblioteki numpy chyba jeszcze bardziej).
Głowy nie mam, by coś porządnego teraz wymyślić, poza takim potworkiem:


from random import randint
import statistics 

def draw():
    drawn_number = randint(1,49)
    if drawn_number not in column:
        column.append(drawn_number)
    else:
        draw()

number_of_draws = int(input("Liczba losowań to: "))
numbers_to_draw = int(input("Ile liczb losować?: "))

print("Liczba losowań to:",number_of_draws)

means = []
standard_devations = []


for z in range(number_of_draws):

    column =[]

    plik=open('plik.txt','a')

    for x in range (numbers_to_draw):
        draw()
    else:
            draw()

    plik.writelines(str(column))
    plik.writelines('\n')
    plik.close()
    print(column)
    
    
    means.append(statistics.mean(column))
    standard_devations.append(statistics.stdev(column))

for i in range (1,number_of_draws + 1): 
  print("Średnia z kolumny nr ", i," to:", means[i-1], "a odchylenie standardowe to:", standard_devations[i-1] )

edit:
Potworek nr 2 z podaniem sumy:


from random import randint
import statistics 
 
def draw():
    drawn_number = randint(1,49)
    if drawn_number not in column:
        column.append(drawn_number)
    else:
        draw()
 
number_of_draws = int(input("Liczba losowań to: "))
numbers_to_draw = int(input("Ile liczb losować?: "))
 
print("Liczba losowań to:",number_of_draws)
 
column_data = []

 
for z in range(number_of_draws):
 
    column =[]
 
    plik=open('plik.txt','a')
 
    for x in range (numbers_to_draw):
        draw()

 
    plik.writelines(str(column))
    plik.writelines('\n')
    plik.close()
    print(column)
 
    column_data.append([statistics.mean(column), sum(column), statistics.stdev(column)])
    
    
for i in range (1,number_of_draws + 1): 
  print("Średnia z kolumny nr ", i," to:", column_data[i-1][0], ", suma liczb to :", column_data[i-1][1],", a odchylenie standardowe to: ", column_data[i-1][2] )

0

Przykład sumowania kolumn

#python 2.7.12
import random
import pprint
a = [[random.randint(1, 10) for i in xrange(5)] for j in xrange(5)]
pprint.pprint(a)

print map(sum, zip(*a))
[[4, 4, 5, 4, 6],
 [7, 3, 1, 7, 2],
 [8, 8, 3, 9, 7],
 [5, 2, 7, 7, 4],
 [6, 4, 9, 10, 4]]
[30, 21, 25, 37, 23]
0

@Serechiel: Dziękuję uprzejmie za chęć pomocy. Czy jednak dałoby radę obliczyć te miary po kolumnach ?

0
Amelka2017 napisał(a):

Dziękuję uprzejmie za chęć pomocy. Czy jednak dałoby radę obliczyć te miary po kolumnach ?

Nie jestem pewien czy o to Ci chodzi:

    plik.writelines(str(column))
     #i tak dalej z kolejnymi danymi
     plik.writelines('\n')
   
    plik.close()
    print("\nWylosowane liczby: ",column)
    print("Suma: ", sum(column))
    print("Średnia: ", statistics.mean(column))
    print("Odchylenie standardowe: ", statistics.stdev(column))

Dodatkowe listy są wówczas zbędne

Potworek po edycji:

from random import randint
import statistics 
 
def draw():
    drawn_number = randint(1,49)
    if drawn_number not in column:
        column.append(drawn_number)
    else:
        draw()
 
number_of_draws = int(input("Liczba losowań to: "))
numbers_to_draw = int(input("Ile liczb losować?: "))
 
print("Liczba losowań to: ",number_of_draws ,", ilość liczb: ",numbers_to_draw )

for z in range(number_of_draws):
 
    column =[]
 
    plik=open('plik.txt','a')
 
    for x in range (numbers_to_draw):
        draw()

 
    plik.writelines(str(column))

    plik.writelines('\n')
    plik.close()
    print("\nWylosowane liczby: ",column)
    print("Suma: ", sum(column))
    print("Średnia: ", statistics.mean(column))
    print("Odchylenie standardowe: ", statistics.stdev(column))
0

Mam na myśli, to jak mamy np takie tablice:

[a, b, c, d, e]
[f, g, h, i, j]

to będą obliczane miary statystyczne po kolumnach czyli np średnia z a i f , średnia z b i g itd .

0

Czyli chyba bardziej przydadzą się macierze i operacje na nich. Z numpy będzie imho łatwiej:
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.matrix.html

Tak na piechotę ( bez numpy):

from random import randint
# import statistics - koment, bo nie kojarzę czy będzie używane
 
def draw():
    drawn_number = randint(1,49)
    if drawn_number not in column:
        column.append(drawn_number)
    else:
        draw()
 
number_of_draws = int(input("Liczba losowań to: "))
numbers_to_draw = int(input("Ile liczb losować?: "))
matrix = [] 

print("Liczba losowań to: ",number_of_draws ,", ilość liczb: ",numbers_to_draw )
 
for z in range(number_of_draws):
 
    column =[]
    
 
    plik=open('plik.txt','a')
 
    for x in range (numbers_to_draw):
        draw()
        
    if column not in matrix:
      matrix.append(column)
    #plik.writelines(str(column))
 
    #plik.writelines('\n')
    #plik.close()


#print(matrix)

for k in  range(numbers_to_draw):
  suma = 0
  for i in range(number_of_draws):
    
    suma += matrix[i][k]
  
  print ("Suma z kolumny nr ", k+1 ,": ",suma)

Sumy chyba liczy poprawnie, a z pozostałymi danymi powinnaś dać sobie radę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1