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: p>
5 Réponses :
Si vous ne pouvez pas utiliser si vous pouvez utiliser numpy code>, vous pouvez utiliser énumérer code> numpy Code>, vous pouvez faire quelque chose comme lon_list [lon_list> = 180.0] - = 360.0 code> p> p> p> P>
sortie strong> p>
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]
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()
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 i> 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.
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)
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 :)
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 code> code>, puis modifier comme
lst [i] = lst [i] - 360 code>. En supposant que la lignex-360 code> est une faute de frappe? Comme il ne le fait rien ... peut-être que vous vouliez direx = x-360 code>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] code>.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