Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3040 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Python programme aide

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Python programme aide

n°2241095
alex9669
Posté le 24-10-2014 à 17:20:18  profilanswer
 

Bonjour messieurs !  
j'ai deux exercices à faire :  
le premier : On suppose que deux listes A, et B sont triées par ordre croissant. Proposer une fonction inter qui prend en arguments deux listes A et B et renvoie l'intersection de ces listes. On veillera à ce qu'elle n'utilise pas plus de len(A)+len(B) lectures de case de A ou B. voilà ce que j'ai fait, mais il y a une erreur que je ne trouve pas.
def inter(A,B):
    j=0
    i=0
    resultat_final=[]
    while i<=(len(A)-1) and j<=(len(B)-1):  
        r=A[i]
        s=B[i]
        if r != s and r > s:
            j+=1
        if r != s and r < s:
            i+=1
        if r == s:
            resultat_final+=[r]
    return resultat_final

 
deuxieme exercice: l'énoncé nous dit que si on a une liste composée d'éléments avec des doublons (ou plus si affinité  :wahoo: ), on doit créer une fonction liste2set qui nous permet d'enlever ces doublons, et donc de renvoyer la meme liste qu'au depart mais sans les doublons. voilà ce que j'ai fait :
 
def liste2set(L):
    E=[L[0]]    
    for i in range(1, len(L)):
            r=L[i]
            if laoupala(r,E) is 'False':
                E+=[r]
    return E

 
La fonction laoupala, permet, comme son nom l'indique, de savoir si un élément r, est dans la liste E, si oui, elle affiche True. Dans le cas inverse, elle affiche False.
 
cette fonction fonctionne quasiment tout le temps, j'ai fait plusieurs essais sauf lorsqu'on met une liste qui ressemble à celle ci :  
[1, 2, 3, 87, 656, 1, 11, 1, 11, 1, 11], qui nous renvoie : [1, 2, 3, 87, 656, 11, 11]
 
avez vous une idée ? d'avance merci;  
cordialement,
 alex

mood
Publicité
Posté le 24-10-2014 à 17:20:18  profilanswer
 

n°2241102
rage2000
Posté le 24-10-2014 à 18:23:04  profilanswer
 

alex9669 a écrit :

Bonjour messieurs !
j'ai deux exercices à faire :
le premier : On suppose que deux listes A, et B sont triées par ordre croissant. Proposer une fonction inter qui prend en arguments deux listes A et B et renvoie l'intersection de ces listes. On veillera à ce qu'elle n'utilise pas plus de len(A)+len(B) lectures de case de A ou B. voilà ce que j'ai fait, mais il y a une erreur que je ne trouve pas.
def inter(A,B):
    j=0
    i=0
    resultat_final=[]
    while i<=(len(A)-1) and j<=(len(B)-1):
        r=A[i]
        s=B[i]
        if r != s and r > s:
            j+=1
        if r != s and r < s:
            i+=1
        if r == s:
            resultat_final+=[r]
    return resultat_final

 

deuxieme exercice: l'énoncé nous dit que si on a une liste composée d'éléments avec des doublons (ou plus si affinité  :wahoo: ), on doit créer une fonction liste2set qui nous permet d'enlever ces doublons, et donc de renvoyer la meme liste qu'au depart mais sans les doublons. voilà ce que j'ai fait :

 

def liste2set(L):
    E=[L[0]]    
    for i in range(1, len(L)):
            r=L[i]
            if laoupala(r,E) is 'False':
                E+=[r]
    return E

 

La fonction laoupala, permet, comme son nom l'indique, de savoir si un élément r, est dans la liste E, si oui, elle affiche True. Dans le cas inverse, elle affiche False.

 

cette fonction fonctionne quasiment tout le temps, j'ai fait plusieurs essais sauf lorsqu'on met une liste qui ressemble à celle ci :  
[1, 2, 3, 87, 656, 1, 11, 1, 11, 1, 11], qui nous renvoie : [1, 2, 3, 87, 656, 11, 11]

 

avez vous une idée ? d'avance merci;
cordialement,
 alex

 

Pour la question 1 t'as pas le droit d'utiliser sort ?

 

Car un truc tout con c'est de concaténer  la list b et la list a et d'ensuite refaire le trie. (mais j'imagine que c'est pas le but de l'exercice :D)

Code :
  1. def interA(list_a, list_b):                                                   
  2.     result_list = list_a + list_b                                             
  3.     result_list.sort()                                                         
  4.     return result_list
 

Après dans ta solution je vois 2 gros problèmes:

 

- tu ne rajoutes pas ton élément a ta liste final dans les cas ou l'une des valeurs est plus petite que l'autre (tu le fais que quand les 2 valeurs sont égales)
- quand tu arrives a la fin d'une des 2 listes tu sors de ta boucle, mais ne prend pas en compte que l'autre n'est pas fini de parcourir. Il faut donc rajouter a la fin le reste.

 

nb: au passage r != s and r > s et r != s and r < s t'as une redondence. Si r > s ou r < s, r et s seront toujours forcement différents
Voila ce que je ferais:

Code :
  1. def interB(list_a, list_b):                                                   
  2.     list_result = []                                                           
  3.     index_a = 0                                                               
  4.     index_b = 0                                                               
  5.     while index_a < len(list_a) and index_b < len(list_b):                     
  6.         val_a = list_a[index_a]                                               
  7.         val_b = list_b[index_b]                                               
  8.         if val_a < val_b:                                                     
  9.             list_result.append(val_a)                                         
  10.             index_a += 1                                                       
  11.         elif val_b < val_a:                                                   
  12.             list_result.append(val_b)                                         
  13.             index_b += 1                                                       
  14.         else:                                                                 
  15.             list_result.extend([val_a, val_b])                                 
  16.             index_a += 1                                                       
  17.             index_b += 1                                                       
  18.     if index_a <= len(list_a):                                                 
  19.         list_result.extend(list_a[index_a:])                                   
  20.     elif index_b <= len(list_b):                                               
  21.         list_result.extend(list_b[index_b:])                                   
  22.     return list_result
 

nb2: j'ai pas testé mon code avant de te le coller si ca se trouve il bug :p

 


Pour le 2eme il y a 2 features cool des lists (qu'on utilise quasi tout le temps en python) et que tu utilises pas.

 

Tu peux faire un "if value in my_list"
si l'element "value" est dans ta list "my_list" ca return True sinon False (en gros c'est ta fonction laoupala qui existe de base dans python :D
exemple:

>>> my_list = [2, 4, 5, 34]
>>> 2 in my_list
True
>>> 3 in my_list
False

 

tu peux faire un for sur une liste (ca va te parcourir la liste du debut a la fin)
exemple:

>>> my_list = [2, 4, 5, 34]
>>> for el in my_list:
...     print el
...
2
4
5
34

 

Du coup tu peux faire un code beaucoup plus simple ;)

Code :
  1. def liste2set(init_list):                                                     
  2.     result_list = []                                                           
  3.     for el in init_list:                                                       
  4.         if el not in result_list:                                             
  5.             result_list.append(el)                                             
  6.     return result_list
 

(ps pour info le while en python on s'en sert pratiquement jamais, comparé au for qu'on utilise a toutes les sauces)


Message édité par rage2000 le 24-10-2014 à 18:26:01

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Python programme aide

 

Sujets relatifs
Programme faux en pythonAide sur une fonction retournat un pointeur sur char. Merci
Besoin d'aide (programmation C)arguments dans programme C
Optimiser un programme MatlabAide correctif pour javascript matrix sous ff
programme simple avec fautesaide pour un programme en python (réception de e mails)
[Python] Aide pour un programme de débutantAide pour un programme python
Plus de sujets relatifs à : Python programme aide


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR