2014-07-18 9 views
0
def vol_tank(R,h): 
    ht = R + 2.3*R 

    if ht >= h: 
     vol = 3.14 * R*R * h + 3.14 * R*R * h/3 
     print ('R: %.1f , h: %.1f - volume: %.2f' % (R,h,vol)) 
    elif R >= h: 
     vol = 3.14 * R*R * h/3 
     print ('R: %.1f , h: %.1f - volume: %.2f' % (R,h,vol)) 
    else: 
     print ('R: %.1f , h: %.1f - overflowing' % (R,h)) 

values = [[0.8, 1, 1.3, 1.5], [1, 1.25, 3.8, 4.5]] 
table = [[vol_tank(R,h) for R in values[0]] for h in values[1]] 

-> Le tableau fait le calcul de tous les nombres de la première liste de «valeurs» avec tous les nombres de la deuxième liste (ex: 0,8 avec 1, 0,8 avec 1,25 , 0,8 à 3,8 et ainsi de suite ...). Mais ce que je voulais, c'était seulement avec leurs paires respectives: 0.8 avec 1, 1 avec 1.25, 1.3 avec 3.8 et 1.5 avec 4.5.Problème avec la fonction dans la boucle for

+0

Si vous contrôlez l'entrée pourquoi sont-ils dans deux listes séparées, pourquoi pas dans les paires? Votre liste de table sera pleine de Aucune –

Répondre

5

Vous recherchez la fonction zip() alors:

table = [vol_tank(R, h) for R, h in zip(*values)] 

Et vous devez retourner le résultat de vol_tank() au lieu de simplement l'impression, sinon table sera une liste complète des valeurs None.

0

Vous pouvez définir des valeurs comme une liste de paires dès le début:

values = [(0.8, 1) (1, 1.25), (1.3, 3.8), (1.5, 4.5)] 

Ou utilisez la fonction zip:

values = [[0.8, 1, 1.3, 1.5], [1, 1.25, 3.8, 4.5]] 
table = [vol_tank(R,h) for R, h in zip(values[0], values[1])] 
-1

emboîtées compréhensions de liste sont comme des boucles imbriquées, pour chaque instance de h dans votre compréhension extérieure, chaque instance de R dans votre compréhension intérieure est exécutée/évaluée. Quatre dans chaque liste, des moyens 16 résultats (4 x 4), à la place, soit refondue votre liste de valeurs sous forme de liste de tuples et boucle sur les tuples avec implicite déballage

values = [(0.8, 1), (1, 1.25), (1.3, 3.8), (1.5, 4.5)] 
table = [vol_tank(R,h) for R, h in values] 

Or boucle un indice entier sur la longueur de les listes (qui doit être le même), comme dans

values = [[0.8, 1, 1.3, 1.5], [1, 1.25, 3.8, 4.5]] 
table = [vol_tank(values[0][i],values[1][i]) for i in range(len(values[0]))] 
0

Votre code est la construction d'un soi-disant produit croisé, qui combine chaque valeur de la première liste à chaque valeur dans la deuxième liste. Ce que vous voulez, c'est de jumeler les valeurs, ce qui revient à choisir toujours la valeur suivante dans chaque liste et à mettre ces valeurs ensemble. Puis pic les valeurs suivantes et ainsi de suite. Comme c'est un problème assez courant, il est déjà disponible en python. C'est la fonction zip. Voici un exemple comment l'utiliser et comment la sortie ressemble:

In [1]: values = [[0.8, 1, 1.3, 1.5], [1, 1.25, 3.8, 4.5]] 
In [2]: zip(*values) 
Out[2]: [(0.8, 1), (1, 1.25), (1.3, 3.8), (1.5, 4.5)] 
+0

Pourriez-vous s'il vous plaît développer votre réponse? –

Questions connexes