-1
votes

Comment modifier une partie d'une liste de flotteurs?

J'ai une liste nommée Lon_List contenant un certain nombre de valeurs de flotteur allant de 0 à 360. Je suis intéressé à soustraire 360 ​​de tout flotteur supérieur ou égal à 180 dans la liste. Comment ferais-je cela?

Voici ma tentative actuelle: xxx


7 commentaires

Pouvez-vous utiliser numpy?


Votre problème est que vous êtes itération des éléments et lorsque vous essayez de changer, vous modifiez simplement la variable locale. Pour modifier le contenu de la liste, itérer sur les indices à l'aide de , puis modifier comme lst [i] = lst [i] - 360 . En supposant que la ligne x-360 est une faute de frappe? Comme il ne le fait rien ... peut-être que vous vouliez dire x = x-360


Utilisez une compréhension de la liste autrement avec un ternaire si: lon_list = [x-360 si x> = 180 ore x pour x dans lon_list] .


J'ai ajouté une réponse. J'espère que cela aide


Je suppose également que vous avez besoin d'une fonction modulo si x> 360?


@Govinddixit Il n'est pas nécessaire de commenter l'ajout d'une réponse. Nous pouvons le voir et l'OP obtient même une notification pour cela!


J'ai compris. Merci @tomerikoo


5 Réponses :


0
votes

Si vous ne pouvez pas utiliser numpy , vous pouvez utiliser énumérer xxx

si vous pouvez utiliser numpy , vous pouvez faire quelque chose comme lon_list [lon_list> = 180.0] - = 360.0


0 commentaires

1
votes

Essayez ceci: xxx

sortie xxx


0 commentaires

1
votes

Vous pouvez simplement utiliser une compréhension de liste pour créer une nouvelle liste avec les modifications requises:

lon_lis = [x if x < 180 else x - 360 for x in lon_lis]


0 commentaires

0
votes

Modification de la liste en place:

from random import uniform
from time import time

the_list = [uniform(1.0, 1000.0) for i in range(1000)]

N_TRIALS = 10000

def test_1():
    t1 = time()
    for trial in range(N_TRIALS):
        lon_list = the_list[0:]
        for i in range(len(lon_list)):
            if lon_list[i] >= 180:
                lon_list[i] -= 360
    t2 = time()
    print("running time for test_1:", t2 - t1)



def test_2():
    t1 = time()
    for trial in range(N_TRIALS):
        lon_list = the_list[0:]
        lon_list = [x if x < 180 else x - 360 for x in lon_list]
    t2 = time()
    print("running time for test_2:", t2 - t1)

if __name__ == '__main__':
    test_1()
    test_2()


6 commentaires

Pourquoi les compréhensions de liste sont-elles chères (comparées à une boucle simple)?


En fait, la liste des compréhensions sont généralement plus rapidement qu'une boucle explicite et équivalente


Vous créez une nouvelle liste qui nécessite une option de mémoire, copier des éléments non modifiés sur, etc. Si la liste n'avait aucun élément> - = 180. Tout ce que l'allocation et la copie auraient été plus de travail par rapport à la solution ci-dessus qui aurait a simplement examiné chaque élément en place et rien mis à jour.


@ Óscarlópez peut-être. Mais que se passe-t-il si il était important de modifier la liste d'origine en place, car il y avait des références?


Vous devriez ajouter ces raisons de votre réponse, pas dans les commentaires.


Chaque cas est différent, bien sûr. Mais sans plus de contexte, l'approche préférée est d'utiliser des compréhensions de liste. La mémoire est bon marché et la mutation des structures de données en place, bien que efficiente, puisse introduire des erreurs. Préférez un style de programmation fonctionnel-ish lors de l'écriture de code Python.



0
votes

De nombreuses langues modernes prennent en charge la carte, le filtre et les fonctions. Cette approche se sentirait plus familière et peut être utilisée dans d'autres langues.

def calc(x):
    return x-360 if (x >= 180) else x

recalculated = map(calc, lon_list)


5 commentaires

Qu'est-ce que la vanille python? Qu'est-ce qu'il n'a pas cette autre solution ici montrant?


A vu une solution suggérée à l'aide de NUMPY. Vanilla signifie juste Python et ses bibliothèques standard.


Quant à ce qui rend cette solution différente, cela fonctionne autour de données immuables - c'est-à-dire des tuples en python.


Je ne vois pas une solution qui utilise numpy; Il n'y a qu'un commentaire à propos de Numpy. Vous devez signaler dans votre réponse, pas dans un commentaire, sur des tuples immuables (qui sont également évités par la compréhension de la liste).


@ 00 j'ai mis à jour ma réponse. Je suppose que mon raisonnement pivotera à l'applicabilité avec d'autres langues :)