1
votes

L'objet 'float' n'est pas itérable dans la compréhension de liste

J'ai deux séries de pandas plg et trd que j'ai transformées en listes et contiennent des entiers. Je souhaite créer un calcul de correction pour plg et trd lorsque plg est négatif, mais je ne sais pas comment aborder cela avec des compréhensions de liste.

J'ai essayé:

[2.0943951023931953,
 2.8623399732707,
 [0.3839724354387517],
 4.71238898038469,
 5.410520681182422,
 1.1344640137963142,
 2.1816615649929116,
 2.129301687433082,
 2.775073510670984,
 2.9146998508305306]

plg est renvoyé correctement avec l'élément 3 retourné à positif mais `trd_up 'ne peut pas apparaître pour parcourir la fonction Zero () car il s'agit d'une liste. Aurais-je juste besoin d'ajouter un autre index enumerate () pour la liste créée par Zero ()?

Je peux corriger cela en insérant l'argument de Zero () dans une liste:

trd_up = [Zero([i - np.pi]) if plg[index] < 0 else i for index,i in enumerate(trd)]

Mais cela renvoie une liste dans une liste: p >

    plg = [ 1.3962634 ,  1.57079633, -0.52359878,  0.61086524,  0.83775804,
    0.17453293,  1.36135682,  1.43116999,  1.57079633,  1.57079633]
    trd = [2.0943951 , 2.86233997, 9.8087504 , 4.71238898, 5.41052068,
   1.13446401, 2.18166156, 2.12930169, 2.77507351, 2.91469985]

    Zero = def ZeroTwoPi(a):
    """
    Zero constrains azimuth to lie between 0 and 2*pi RADIANS.

    Returns azimuth b (from 0 to 2*pi) for input azimuth a.

    NOTE: Azimuths a and b are input/output in radians.
    """
    b = a;
    twopi = 2.0*np.pi
    x = [b + twopi if b < 0 else b - twopi if b>= twopi else b for b in a]
    return x

    plg_up = [-i if i < 0.0 else i for i in plg ]
    trd_up = [Zero(i - np.pi) if plg[index] < 0 else i for index,i in enumerate(trd)]


2 commentaires

En effet, [b <0 for b in plg] est True s’évalue toujours à False


Salut Michael, merci! Je ne sais simplement pas comment je pourrais maintenant faire fonctionner (i - np.pi) lorsque b <0 dans plg.


5 Réponses :


0
votes

J'utiliserais enumerate pour obtenir un index de l'élément sur lequel vous travaillez actuellement. enumerate vous permettra d'obtenir à la fois l'élément de liste et sa position dans la liste, que j'ai appelé index ci-dessous. Vous pouvez utiliser index dans la compréhension de la liste pour obtenir l'élément correspondant dans plg.

trd_up = [i - np.pi if plg[index] < 0 else i for index, i in enumerate(trd)]


0 commentaires

0
votes

Vous souhaitez simultanément vérifier l'élément correspondant dans les deux listes pour lesquelles vous pouvez utiliser enumerate qui vous renverra l'élément à la même position dans l'autre liste.
trd_up = [i - np.pi if plg [index] <0 else i for index, i in enumerate (trd)]


1 commentaires

Comment pourrais-je modifier ce code si je modifie ce (i-np.pi) est une liste qui est passée par une fonction qui produit une autre liste? J'ai le format de code suivant:




0
votes

Le haut est juste, le point clé est que vous devez obtenir l'index.

Si vous ne voulez pas utiliser enumerate , essayez simplement pour ou while loop

Par exemple:

for i in xrange(len(trd)):
    if plg[i]<0:
        trd_up[i]=trd[i]-np.pi
    else:
        trd_up[i]=trd[i]


0 commentaires

0
votes

Comme suggéré dans d'autres réponses, vous pouvez utiliser enumerate pour accéder à l'élément avec le même index depuis plg . De plus, pour votre première liste, vous pouvez utiliser la fonction intégrée abs .

plg_up = [abs(x) for x in plg]
trd_up = [x - np.pi if plg[i] < 0 else x for i, x in enumerate(trd)]


0 commentaires