Récuperer les nombres dans deux tabelaux - Python - Programmation
Marsh Posté le 14-05-2012 à 18:17:38
Rapidement ça donnerait :
Code :
|
Pas tout à fait optimal vu que zip(a,b) va te renvoyer une liste complète des tuples a,b alors que tu vas en dégager certains qui respectent pas ta condition, m'enfin...
Marsh Posté le 15-05-2012 à 14:36:22
En fait j'ai un autre soucis, je cherche à récupérer des max sur des intervalles, j'ai donc découpé en intervalles puis je trie et je récupère la dernière valeur, tout marche bien sauf que je n'arrive pas à mettre ces résultats sous forme de tableau dans un fichier résultat, malgré toutes mes tentatives donc si vous pourriez me donner encore un petit coup de pouce ça serait génial.
for i in range(20):
alpha=2500*i
beta=2500*(i+1)
c=[(val_1,val_2) for val_1,val_2 in zip(f,h) if alpha<val_1<beta]
trie=[(val1,val2) for val1,val2 in sorted(c))]
taille_trie=len(trie)
maximum=trie[taille_trie-1]
for (val1,val2) in maximum:
tableau="%8s %8s" % (val1,val2)+"\n"
res=open("resultat.txt","a" )
res.write(tableau)
Erreur PYTHON:
Traceback (most recent call last):
File "enveloppe.py", line 36, in <module>
for (val1,val2) in maxi:
TypeError: 'int' object is not iterable
Marsh Posté le 15-05-2012 à 15:26:29
Me semble logique, dans
Code :
|
tu récupères un tuple (int, int). Ensuite tu tentes d'itérer sur ce tuple unique en l'unpackant, c'est pas possible. À quoi te sert ton maximum et pourquoi t'itère là dessus et non sur ton array?
Accessoirement, la première boucle sert à rien, tu prends que la dernière itération en compte.
Marsh Posté le 15-05-2012 à 16:40:19
en fait j'ai deux intervalles a et b, je cherche à récupérer pour tous les nombres compris entre 0 et 2500 dans a le maximum dans b et de même entre 2500 et 5000.... jusqu'à 50000. (les indices de a correspondent aux indices de b). Je sais que c'est surement top comme j'ai fait mais vu que j'utilise python pour la première fois c'est la seule méthode que j'ai réussie à faire tourner!
En effet écrit comme ça la première boucle ne sert à rien
Marsh Posté le 15-05-2012 à 18:04:13
joaninha18 a écrit : en fait j'ai deux intervalles a et b, je cherche à récupérer pour tous les nombres compris entre 0 et 2500 dans a le maximum dans b et de même entre 2500 et 5000.... jusqu'à 50000. (les indices de a correspondent aux indices de b). Je sais que c'est surement top comme j'ai fait mais vu que j'utilise python pour la première fois c'est la seule méthode que j'ai réussie à faire tourner! |
Bon ça me semble confus, on va voir si j'arrive à comprendre:
C'est ça?
Trucs pas indiqués: quand tu récupères le maximum de B pour chaque section, tu veux la valeur de A correspondant? Et l'intervalle de A (genre 7500, 10000)?
Marsh Posté le 16-05-2012 à 14:34:54
C'est exactement ça!!! Et je veux récupérer le couple sous forme de tableau dans un fichier texte car avec ma technique (très probablement médiocre), je ne récupère ces couples que dans la console et je dois faire un copier coller puis enlever les parenthèses et les virgules en bref ce n'est pas super optimisé!!!
(merci pour votre patience!)
Marsh Posté le 16-05-2012 à 15:30:53
joaninha18 a écrit : C'est exactement ça!!! Et je veux récupérer le couple |
"Le couple", c'est la paire (valeur de A, valeur de B) dans chaque section de A?
joaninha18 a écrit : sous forme de tableau dans un fichier texte |
Qu'entends tu par "sous forme de tableau"? Il y a des miyons de manières de modéliser un tableau dans un fichier texte, de fixed-length (chaque colonne prend N caractère point barre) à une table org-mode
Marsh Posté le 16-05-2012 à 17:23:59
oui désolé pour la confusion par couple je voulais dire paire (valeur de A, valeur de B) dans chaque section de A et par tableau c'est à dire si je récupère les paires suivantes (200, 30) (2700, 50) avoir le tableau suivant
200 30
2700 50
.........
Marsh Posté le 16-05-2012 à 18:53:32
joaninha18 a écrit : oui désolé pour la confusion par couple je voulais dire paire (valeur de A, valeur de B) dans chaque section de A et par tableau c'est à dire si je récupère les paires suivantes (200, 30) (2700, 50) avoir le tableau suivant |
Genre du tab-separated values quoi
Marsh Posté le 16-05-2012 à 21:37:13
En effet, je ne savais pas ce qu'étais un tab-separated values mais après avoir regardé sur internet je confirme que c'est ça que je cherche à faire!
Marsh Posté le 17-05-2012 à 17:56:08
Bon, dans la mesure où on a établi les specs, on peut résoudre le problème.
Pour commencer, il nous faut deux séquences, je vais les générer mais normalement on voudra probablement les récupérer de stdin ou d'un fichier quelconque.
Code :
|
Bien, on a notre setup: une liste de A, une liste de B, maintenant on veut splitter ça dans nos 20 ranges. On va utiliser la manière la plus simple (mais probablement la plus lente) de le faire: on va filtrer A pour chacune des ranges
Code :
|
À ce stade, on a 20 ranges avec 1 à 10 paires chaque (pour la seed forcée, sinon les runs sont pas stables et c'est chiant).
Nous reste plus qu'à récupérer le "b" maximum dans chaque range:
Code :
|
et à imprimer le tout en sortie, au lieu de le mettre dans un fichier je vais l'envoyer sur stdout (c'est plus flexible), et je vais utiliser le module CSV de la stdlib, c'est plus clean imo:
Code :
|
Au début du post, j'ai noté que la méthode indiquée au dessus était simple mais probablement lente (sur un peu plus de 100 objets, je veux dire) (j'ai pas profilé en fait, donc bon). Les raisons sont multiples:
Code :
|
Notes finales:
Marsh Posté le 23-05-2012 à 09:43:57
Merci beaucoup pour les conseils, ça m'a fait connaitre quelques fonctions python en plus c'est bien utile! Et surtout une méthode différente de raisonner!
Marsh Posté le 14-05-2012 à 15:30:29
Bonjour,
J'ai un petit soucis pour sélectionner des nombres dans python, j'aimerais sélectionner les données d'un tableau a et d'un tableau b si on respecte une certaine condition sur les données de b.
Mon "script" est le suivant
a=[3,5,7,9,11]
b=[1,24,65,78,2]
c=[(val_1,val_2) for val_1,val_2 in a,b if val_2<60]
print(c)
j'aimerais alors que la ligne suivante s'imprime
c=[(3,1),(5,24),(11,2)]
et comme vous pouvez vous en douter ça ne marche pas en effet j'ai déjà fait comme ça pour récupérer des données d'une même liste mais pour deux listes je ne trouve pas la bonne façon de faire, j’espère vraiment que vous allez pouvoir m'aider car je suis totalement débutante et j'ai essayé plein de trucs différents et aucun ne marche. Je craque!!!!
Je vous remercie d'avance pour votre aide