Python programme aide

Python programme aide - Python - Programmation

Marsh Posté le 24-10-2014 à 17:20:18    

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

Reply

Marsh Posté le 24-10-2014 à 17:20:18   

Reply

Marsh Posté le 24-10-2014 à 18:23:04    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed