» »

Python - pomoč!

Python - pomoč!

MP125 ::

Zdravo. Zanima me kako rešiti naslednji problem:
Dan je seznam števil. Sestavi funkcijo najParSestej(seznam), ki bo v njem poiskala vse tiste pare, ki dajo največjo absolutno razliko. Funkcija naj vrne seznam parov indeksov, ki določajo najdene pare. Vhodnega seznama naj ne spreminja. To preveri tako, da si ogledeš seznam pred in po klicu! Funcija naj vrne števili kot urejen seznam!

Predpostavka je, da imamo v seznamu vsaj dva elementa in da so vsi elementi v seznamu števila. Primer: za vhodni seznam [1, 4, 3, -1, 0, 3.5, 4] naj funkcija vrne [[1, 3], [3, 6]]. Za seznam [100, 5, -5] dobimo [[0, 2]], za seznam [1, 2, 3, 4, 5] naj vrne seznam [[0, 4]], za seznam [100, -6, -6, 100] naj vrne [[0, 1], [0, 2], [1, 3], [2, 3]].


To funkcijo imam rešeno, sedaj pa je potrebno to funkcijo dodelati, da bo poleg števil v seznamu dopuščala tudi nize, ki predstavljajo števila in sezname z natanko enim elementom - številom, npr. "5", "-34", [6.27], [2], "8.23", "-23.6", ...

def najParSestej(seznam):
    i=0
    najvecjaRazlika = 0
    pari = []
 
    while i < len(seznam):        
        j=i 

        while j < len(seznam):

            razlika = abs(float(seznam[i])-float(seznam[j]))  
            
            if razlika > najvecjaRazlika:
                najvecjaRazlika = razlika
                pari=[]
                pari.append([i,j])
            
            elif razlika == najvecjaRazlika:
                pari.append([i,j])
            
            j+=1
        i+=1
    return pari


Kako naj se lotim tega?
  • spremenil: Mavrik ()

Mavrik ::

Za naslednjič - forum ima st.koda značko, s katero postane lepljena koda bistveno bolj berljiva ;)
The truth is rarely pure and never simple.

Yacked2 ::

Največji par je lahko samo en ? Iz seznama poišči največje ter najmanjše število, ter jih vrni ?

v Javi: (ne testirano)

private static int[] najParSestej (int[] seznam)
{
   int najmanjsa = seznam[0];
   int najvecja = seznam[0];
   for(int i=1;i<seznam.length;i++)
   {
       if(seznam[i] < najmanjsa)
       {
           najmanjsa = seznam[i];
       }
       if(seznam[i] > najvecja)
       {
           najvecja = seznam[i];
       }
   }
   int[] resitev = new int[2];
   resitev[0] = najmanjsa;
   resitev[1] = najvecja;
   return resitev;
}
Korak naprej ni vedno ustrezen...sploh če si na robu prepada!

Math Freak ::

En način je da pogledaš, če je eden od elementov seznama seznam. Iz njega potegneš ven en element, saj dva ali več ne sme imeti. Za nize maš že tko poskrbljeno, saj jih pretvoriš v float.

def najParSestej(seznam):
    i=0
    najvecjaRazlika = 0
    pari = []
  
    while i < len(seznam):        
        j=i 
 
        while j < len(seznam):

            if type(seznam[i]) is list:
                if type(seznam[j]) is list:
                    razlika = abs(float(seznam[i][0])-float(seznam[j][0]))
                else :
                    razlika = abs(float(seznam[i][0])-float(seznam[j]))
            elif type(seznam[j]) is list:
                razlika = abs(float(seznam[i])-float(seznam[j][0]))
            else:
                razlika = abs(float(seznam[i])-float(seznam[j]))  
             
            if razlika > najvecjaRazlika:
                najvecjaRazlika = razlika
                pari=[]
                pari.append([i,j])
             
            elif razlika == najvecjaRazlika:
                pari.append([i,j])
             
            j+=1
        i+=1
    return pari

print(najParSestej([1, 4, 3, -1, 0, 3.5, 4]))
print(najParSestej([100, 5, -5]))
print(najParSestej([1, 2, 3, 4, 5]))
print(najParSestej([100, -6, -6, 100]))
print(najParSestej(["5", "-34", [6.27], [2], "8.23", "-23.6"]))

technolog ::

[1, 4, 3, -1, 0, 3.5, 4]

a ni tukaj rešitev samo ena, in sicer: [3, 1], razlika pa je 5?

Math Freak ::

[3,1]: |-1-4| = 5
[3,6]: |-1-4| = 5

technolog ::

No, pol se da to rešit O(n).

lknix ::

much fun :)

from itertools import product
from functools import wraps


def cast_type(f):
  @wraps(f)
  def _cast(seznam):
    nov_seznam = map(lambda stevilo: float(stevilo[0]) if isinstance(stevilo, list)
                     else float(stevilo), seznam)
    return f(nov_seznam)
  return _cast


@cast_type
def najPrestej(seznam):
  def f(stevilo):
    return lambda x: x[1] == stevilo

  min_val, max_val = min(seznam), max(seznam)
  return map(lambda par: sorted((par[0][0], par[1][0])),
             product(filter(f(min_val), enumerate(seznam)), filter(f(max_val), enumerate(seznam))))



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

python-rabim pomoč

Oddelek: Programiranje
162480 (710) rnla1973
»

Python - pomoč (strani: 1 2 3 )

Oddelek: Programiranje
10315859 (6607) black ice
»

Programiranje v pythonu

Oddelek: Programiranje
141634 (992) Sony-Tech
»

[Python] Domači nalogi

Oddelek: Programiranje
332552 (1442) ragezor
»

Python iskanje podvojenih vrednosti

Oddelek: Programiranje
181259 (972) BlueRunner

Več podobnih tem