2008-09-12 8 views
1

Je vous écris un programme pour simuler les sociétés de données de sondages réels comme Gallup ou Rasmussen publient tous les jours: www.gallup.com et www.rassmussenreports.comStockage de plusieurs tableaux en Python

J'utilise une méthode de force brute , où l'ordinateur génère des données d'interrogation quotidiennes aléatoires, puis calcule des moyennes sur trois jours pour voir si la moyenne des données aléatoires correspond aux nombres des sondeurs. (La plupart des numéros de sondage des entreprises sont des moyennes sur trois jours)

Actuellement, cela fonctionne bien pour une itération, mais mon objectif est de produire la simulation la plus courante correspondant aux données d'interrogation moyennes. Je pourrais alors changer le code de n'importe où de 1 à 1000 itérations.

Et c'est mon problème. A la fin du test, j'ai un tableau dans une seule variable qui ressemble à ceci:

[40.1, 39.4, 56.7, 60.0, 20.0 ..... 19.0] 

Le programme produit actuellement un tableau pour chaque simulation correcte. Je peux stocker chaque tableau dans une seule variable, mais je dois alors avoir un programme qui pourrait générer de 1 à 1000 variables en fonction du nombre d'itérations que j'ai demandé !?

Comment éviter cela? Je sais qu'il y a une façon intelligente de faire cela qui n'exige pas que le programme génère des variables pour stocker des tableaux en fonction du nombre de simulations que je veux.

test Code

pour McCain:

test = [] 

while x < 5: 

    test = round(100*random.random()) 

    mctest.append(test) 

    x = x +1 


mctestavg = (mctest[0] + mctest[1] + mctest[2])/3 

#mcavg is real data 

if mctestavg == mcavg[2]: 
    mcwork = mctest 

Comment puis-je répéter sans créer de multiples mcwork vars?

Répondre

2

Un truc pareil pourrait-il fonctionner?

from random import randint  

mcworks = [] 

for n in xrange(NUM_ITERATIONS): 
    mctest = [randint(0, 100) for i in xrange(5)] 
    if sum(mctest[:3])/3 == mcavg[2]: 
     mcworks.append(mctest) # mcavg is real data 

En fin de compte, il vous reste une liste de mctest valides listes.

Ce que je changé:

  • Utilisé un list comprehension pour construire les données au lieu d'une boucle
  • Utilisé random.randint pour obtenir des entiers aléatoires
  • occasion slices et sum pour calculer la moyenne des trois premiers items
  • (Pour répondre à votre question :-)) Mettez les résultats dans une liste mcworks, au lieu de créer une nouvelle variable pour chaque itération
+0

Merci! Beaucoup plus simple que ce que j'ai écrit – andy

2

Parlez-vous de cela?

>>> a = [ ['a', 'b'], ['c', 'd'] ] 
>>> a[1] 
['c', 'd'] 
>>> a[1][1] 
'd' 
+0

Donc, c'est juste un tableau de tableaux? Ça me rend stupide. – andy

+0

Ne vous sentez pas stupide. Python est Python;) –

1

listes en python peuvent contenir tout type d'objet - Si je comprends bien la question, est-ce un list de list s faire le travail? Quelque chose comme ça (en supposant que vous avez une fonction generate_poll_data() qui crée vos données.

data = [] 

for in xrange(num_iterations): 
    data.append(generate_poll_data()) 

Ensuite, data[n] sera la liste des données de la (n-1) e run

+0

s/nth/(n + 1) th/run. Les courses sont comptées à partir de 1 (première manche, deuxième manche, etc.). – jfs

1

puisque vous pensez à des variables, vous pouvez préférer un dictionnaire sur une liste de listes:

data = {} 
data['a'] = [generate_poll_data()] 
data['b'] = [generate_poll_data()] 

etc.

+0

Penser aux variables? Que pourrais-je penser d'autre? Un peu d'arrière-plan. Je connais un peu PASCAL et je l'utilise comme projet pour apprendre Python. – andy

+0

Je préférerais un Dict de listes à une liste de listes aussi. –

1

Je voudrais fortement utiliser NumPy pour ce faire. Vous obtenez des tableaux N-dimensional efficaces que vous pouvez traiter rapidement et facilement.

Questions connexes