» »

Programiranje v pythonu

Programiranje v pythonu

IseeMyself ::

Pozdravljeni!
Potrebujem pomoč pri sestavi 2 programov v pythonu. Nalogi se navezujeta na temo funkcij in modulov. Prve naloge sem se lotil s s = s.replace("x", "y") vendar mi funkcija vrne ["5.180, 5.907, 6.632, 7.215"] morala pa bi vrniti brez podpičij --> [5.180, 5.907, 6.632, 7.215]. Pri drugem programu pa sem od vsakega elementa odštel element pred njim in če je rezultat > od 0.1 naj izpiše True drugače pa False in naj to ponavlja. Funkcija mi vrne [True, True, True, True, False, False, True] kar pa je seveda glede na navodilo napačno. Spodaj prilagam nalogi. Prosim za pomoč oz., če lahko kdo nalogi reši. Hvala! :)


v_seznam(s) prejme čase v obliki niza, v katerem so števila zapisana z decimalno vejico in med seboj ločena s podpičji. Funkcija naj vrne seznam števil. Tako mora klic v_seznam()"5,180; 5,907; 6,632; 7,215") vrniti [5.180, 5.907, 6.632, 7.215].

oznaci_veljavne(s) prejme seznam časov. Vrne enako dolg seznam vrednosti True in False, pri čemer je False na mestih, kjer so neveljavne meritve. Neveljavne so tiste meritve, ki so od kake druge meritve oddaljene manj kot 0.1 sekunde. Klic oznaci_veljavne([5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5]) mora vrniti [True, True, True, False, False, False, True], saj so prve tri meritve veljavne (razmik med njimi je večji od 0.1), naslednje tri neveljavne, zadnja pa je spet veljavna.

jype ::

Prilepi, kaj si do zdaj naredil.

krneki0001 ::

s = s.replace('x', 'y')

am-on ::

Pri prvi ti manjka še split, in pretvorba iz string v float.

def v_seznam(string):
    return [float(x) for x in string.replace(" ","").replace(",",".").split(";")]

def oznaci_veljavne(list):
    return [current-before>0.1 and after-current>0.1 for before, current, after in zip([list[0]-1] + list[0:-1], list, list[1:] + [list[-1]+1]  )]

print(oznaci_veljavne(v_seznam("5,1; 5,6; 6,0; 10,34; 10,37; 10,45; 12,5")))

#output: [True, True, True, False, False, False, True]


Koda za obe nalogi (namenoma kratka, da najbrž ne bo primerna za oddajo na šoli). Poskusi narediti sam in še kaj vprašaj, ko se ti zatakne.

Zgodovina sprememb…

  • spremenil: am-on ()

hruske ::

@IseeMyself,

Zgolj s.replace ne bo dovolj, ker s.replace vrne nov niz znakov (string), ti pa imaš zahtevo, da mora funkcija v_seznam vračati seznam števil.

Najprej moraš vhodni niz podatkov razdelit tako, da dobiš seznam posameznih vrednosti v obliki niza znakov (string). Ker bojo te vrednosti še vedno v obliki niza znakov, jih moraš še pretvoriti v število. Pretvorjene vrednosti si moraš shranjevat v nek seznam, ki ga, ko obdelaš vse vrednosti, vrneš kot rezultat funkcije.
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator

Zgodovina sprememb…

  • spremenilo: hruske ()

flameir ::

def v_seznam(s):
    s.split()
    return s


mene pa zanima zakaj tole ni ok npr.

hruske ::

Če pogledaš v dokumentacijo za str.split, piše, da vrne seznam nizov. Tvoj s.split() torej vrne nekaj, česar nikamor ne shraniš.

Pomembno je tudi vedet, da so nizi znakov v Pythonu nespremenljivi - če kličeš funkcijo, ki spreminja niz znakov, bo ta funkcija vrnila nov niz znakov, novo kopijo. Prejšnja vrednost, ki je shranjena v neki spremenljivki, se ne bo spremenila sama od sebe.

V tvojem primeru funkcija v_seznam vrača isto vrednost, kot jo je dobila s parametrom s.
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator

am-on ::

@flameir

V tvojem primeru je več problemov. Prvi je ta, da s.split() ne spremeni direktno s, temveč le vrne rezultat. Ti si vbistvu napisal funkcijo, ki vrne vhod, vmes pa v prazno kliče še split.
a = "5,1; 5,6; 6,0; 10,34; 10,37; 10,45; 12,5"
a.split()

print(a)
#izpiše še vedno "5,1; 5,6; 6,0; 10,34; 10,37; 10,45; 12,5"

print(a.split())
#izpiše tabelo ['5,1;', '5,6;', '6,0;', '10,34;', '10,37;', '10,45;', '12,5']
# še vedno pa so problem podpičja, ker split() ločuje po presledkih

a = a.split()
print(a)
#a je sedaj tabela ['5,1;', '5,6;', '6,0;', '10,34;', '10,37;', '10,45;', '12,5']


Tudi ko funkcijo "popravimo", še vedno nismo najbolj zadovoljni z rezultatom
def v_seznam(s):    
    return s.split()

#če te moti direktno vračanje, lahko tudi

def v_seznam(s):
    s = s.split()
    return s


Funkcija vrne seznam, števila so med sabo pravilno ločena, žal pa imajo števila zraven še podpičja in so predstavljena kot stringi.
Najlažje je, če se že pred splitanjem znebimo podpičji, lahko pa se jih rešimo tudi pozneje s sprehodom čez seznam kar pa je malce manj učinkovito.

def v_seznam(s):    
    return s.replace(";","").split()

# ali na dolgo:
def v_seznam(s):
    s = s.replace(";","")
    s = s.split()
    return s


Edini problem, ki ga še imamo je to, da so številke v obliki stringov in ne floatov. Pri tem nam dodaten problem dela še vejica (5,3) pri zapisu števil namesto pike (5.3).
Najlažje je, če vejico preprosto zamenjamo s piko, se znebimo podpičji, splitamo string v seznam, se sprehodimo po elementih seznama in jih pretvorimo v float.

def v_seznam(s):    
    return [float (x) for x in s.replace(",",".").replace(";","").split()]

# ali na dolgo:
def v_seznam(s):
    s = s.replace(",",".")
    s = s.replace(";","")
    s = s.split()

    # namesto for zanke, v teh primerih pride prav tudi funkcija map: map(float, s)
    for i, x in enumerate(s):
        s[i] = float(x)

    return s

Zgodovina sprememb…

  • spremenil: am-on ()

hruske ::

@am-on, zakaj pa ne narediš s.split(";")?
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator

am-on ::

Potem imaš pa odveč presledke :D

"1; 5; 6".split(";") -> ['1', ' 5', ' 6']

Lahko pa bi naredil s.split("; ").

OrkAA ::

Sem se jaz probal resit :)

#!/usr/bin/env python

def v_seznam(vhod):
    meritve = []
    # Najprej string pri podpicju
    for meritev in vhod.split(';'):
        # Vsaki meritvi odstranimo dodaten string in vejico zamenjamo s piko,
        # da se zadeva lahko pretvori v float.
        meritev = meritev.strip().replace(',', '.')
        # Pretvorba iz stringa v float
        meritev = float(meritev)
        meritve.append(meritev)
    return meritve

def oznaci_veljavne(vhod):
    veljavne = []
    # Enumerate nam pove na katerem mestu (index) v listu se nahajamo.
    # S tem lahko izvlecemo meritev pred in po trenutni, ker ju potrebujemo za primerjavo.
    for index, item in enumerate(vhod):
        # Vzamemo prejsnjo meritev razen, ce se nahajamo na zacetku lista. V tem primeru
        # si jo izmislimo in recemo, da je 0.
        before_item = vhod[index-1] if index != 0 else 0
        # Vzamemo naslednjo meritev, razen ce smo na koncu lista. V tem primeru zadnjo meritev
        # povecamo za ena, ker na tak nacin zagotovimo, da bo spodnji pogoj vedno vrnil True.
        after_item = vhod[index+1] if index != len(vhod)-1 else item+1
        veljavne.append(item - before_item > 0.1 and after_item - item > 0.1)
    return veljavne


print v_seznam("5,180; 5,907; 6,632; 7,215")
print oznaci_veljavne([5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5])


Zanalasc nisem uporabil nobene knjiznice iz stdliba, ki bi delo olajsala, ker nisem sure, ce jih naloga dovoli. Lahko kdo proba se na tak nacin, da vidimo koliko se da kodo polepsat. :)

Upam, da mi opravicite prepletanje angleskih in slovenskih izrazov. Dost je ze ura. :)

Zgodovina sprememb…

  • spremenil: OrkAA ()

krneki0001 ::

OrkAA je izjavil:

Upam, da mi opravicite prepletanje angleskih in slovenskih izrazov. Dost je ze ura. :)


Sej programiranje je malo slovenščine, malo angleščine in malo matematike.

Zgodovina sprememb…

technolog ::

OrkAA, sedi, cvek.

oznaci_veljavne([0, 15])

Pravilno: [True, True]
Tvoje: [False, True]

OrkAA ::

technolog: mas prav, malo sem bil len :)

#!/usr/bin/env python

def v_seznam(vhod):
    meritve = []
    # Najprej string locimo pri podpicju
    for meritev in vhod.split(';'):
        # Vsaki meritvi odstranimo dodaten space in vejico zamenjamo s piko,
        # da se zadeva lahko pretvori v float.
        meritev = meritev.strip().replace(',', '.')
        # Pretvorba iz stringa v float
        meritev = float(meritev)
        meritve.append(meritev)
    return meritve

def oznaci_veljavne(vhod):
    veljavne = []
    # Enumerate nam pove na katerem mestu (index) v listu se nahajamo.
    # S tem lahko izvlecemo meritev pred in po trenutni, ker ju potrebujemo za primerjavo.
    for index, item in enumerate(vhod):
        # Smo na zacetku
        if index == 0:
            is_valid = vhod[index+1] - item > 0.1
        # Smo na koncu
        elif index == len(vhod) - 1:
            is_valid = item - vhod[index-1] > 0.1
        # Smo kjerkoli se da primerjat prejsnjo in naslednjo
        else:
            is_valid = item - vhod[index-1] > 0.1 and vhod[index+1] - item > 0.1
        veljavne.append(is_valid)
    return veljavne


print v_seznam("5,180; 5,907; 6,632; 7,215")
print oznaci_veljavne([5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5])
print oznaci_veljavne([0, 15])


A bo v redu? :)

Sony-Tech ::

test = []
novSeznam = []

def oznaci_veljavne(s):
    for i in range(len(s)):
        for j in range(len(s)):
            if s[i] != s[j] and abs(s[i] - s[j]) > 00.10:
                test.append(j)
        if len(test) == 6:
            novSeznam.append("True")
        else:
            novSeznam.append("False")
        test.clear()

seznam = [5.1, 5.6, 6.0, 10.34, 10.37, 10.45, 12.5]
oznaci_veljavne(seznam)
print(seznam)
print(novSeznam)

string = "5,180; 5,907; 6,632; 7,215"

def seznam(s):
    for i in range(len(s)):
        if s[i] == ";":
            print(i)
            #for j in range(i):
            #    print(s[j], end = "")
            

seznam(string)


Vredno ogleda ...

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

Python šumniki

Oddelek: Programiranje
82312 (2091) oemdzi
»

Naloga iz Putka - UPM

Oddelek: Programiranje
242213 (1549) NejcSSD
»

Python, prosim za pomoc pri programiranju (strani: 1 2 3 )

Oddelek: Programiranje
10413964 (10066) lenika
»

C# Regex.Replace()

Oddelek: Programiranje
6947 (866) D-monLord
»

[Java] Shranjevanje podatkov in datotek

Oddelek: Programiranje
71228 (1181) Vesoljc

Več podobnih tem