Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zadaci za wannabe pythoniste

[es] :: Python :: Zadaci za wannabe pythoniste

Strane: << < .. 16 17 18 19 20 21 22 23 24 25 ... Dalje > >>

[ Pregleda: 50992 | Odgovora: 629 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Zadaci za wannabe pythoniste18.03.2020. u 18:19 - pre 49 meseci
Pridružujem se čestitkama!
Naravno, uvek može i malo bolje

Code:
import time
import re

MyWord = "abrakadabra..!-?"
regex = re.compile(r"[^a-z]+")

start=time.time()

for i in range(1_000_000):
    slova = []
    for ch in MyWord:
        if ch not in slova and ch >= "a" and ch <= "z":
            slova.append(ch)


end=time.time()
print(slova)
print(end-start)

start=time.time()

for i in range(1_000_000):
    slova=set()
    slova = set(regex.sub("", MyWord))


end=time.time()
print(slova)
print(end-start)

Code:
Rezultat:

['a', 'b', 'r', 'k', 'd']
2.6087019443511963
{'a', 'd', 'r', 'k', 'b'}
1.4458417892456055


Korišćenjem regularnog izraza i skupa umesto liste, eliminisao sam jednu petlju, jedan if sa tri logička izraza i append, pa sam na milion izvršavanja dobio upola kraće vreme.
Ovo jeste teranje maka na konac, ali pokazuje da uvek ima mesta da se unapredi algoritam i da se odabere bolja struktura podataka za dati problem.
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste18.03.2020. u 20:46 - pre 49 meseci
Citat:
Korišćenjem regularnog izraza i skupa umesto liste, eliminisao sam jednu petlju, jedan if sa tri logička izraza i append, pa sam na milion izvršavanja dobio upola kraće vreme.


Ako zamniš ch >= "a" and ch <= "z" sa ch in 'abcdefghijklmnopqrstuvwxyz' kao i set regex sa {ch for ch in MyWord if ch in 'abcdefghijklmnopqrstuvwxyz'} dobićeš jos kraće vreme.
Code:
%timeit set(regex.sub("", MyWord))
1.36 µs per loop

%timeit {ch for ch in MyWord if ch in 'abcdefghijklmnopqrstuvwxyz'}
1.26 µs per loop

%timeit [ch for ch in MyWord if ch >= "a" and ch <= "z"]
1.4 µs per loop

%timeit [ch for ch in MyWord if ch in 'abcdefghijklmnopqrstuvwxyz']
1.07 µs per loop
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste18.03.2020. u 21:30 - pre 49 meseci
Citat:
To je po onome, i ćorava koka ubode neko zrno.

Po mom mišljnju opet imaš koje zrno viška, na primer:
Code:

brojac = {}
for ch in 'abcdefghijklmnopqrstuvwxyz':
    brojac[ch] = 0

br_reci = 0
spisak = open('reci2.txt', 'r', encoding='utf-8')

for rec in spisak:
    rec = rec.lower().rstrip()
    
    # Lista slova koja se pojavljuju u rečima, ali bez ponavljanja.
    slova = []
    for ch in rec:
        if ch not in slova and ch >= "a" and ch <= "z":
            slova.append(ch)
    # Brojač za slova
    for ch in slova:
        brojac[ch] = brojac[ch] + 1
    # Brojač za reči
    br_reci = br_reci + 1


Imaš dve suvišne for petlje, nema potrebe da prvo dodaješ slova u brojač.
Recimo da hoćeš da prebrojiš i naša ili neka druga slova, a nemaš ih u rečniku, dobio bi Key error grešku pošto isti nije u rečniku.

Code:
spisak = open('reci2.txt', 'r', encoding='utf-8')
brojac = {}
br_reci = 0

for rec in spisak:
    rec = rec.lower().rstrip()
    
    # Lista slova koja se pojavljuju u rečima, ali bez ponavljanja.
    slova = []
    for ch in rec:
        if ch not in slova and ch >= "a" and ch <= "z":
            slova.append(ch)
       # Brojač za slova
        if ch not in brojac:
            brojac[ch]=1
        else:
            brojac[ch]+=1
    br_reci = br_reci + 1


Takođe, za brojač može da se iskoristi defaultdict iz collections modula:
Code:
from collections import defaultdict

brojac = defaultdict(int)

# Umesto if/else
if ch not in brojac:
    brojac[ch]=1
else:
    brojac[ch]+=1

# je dovoljno
brojac[ch]+=1

 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.175.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste25.03.2020. u 16:07 - pre 48 meseci
Borim se sa zadatkom broj 31:

Podaci se sastoje od preko 200 fajlova. Svaki fajl sadrži spisak od 100 imena koja su u SAD bila najpolularnija u datoj godini, zajedno s brojem upotreba svakog imena. Imena su u fajlu poređana od najviše korišćenog pa naniže. Postoje dva fajla za svaku godinu: jedan sadrži imena koja se koriste za devojčice, a drugi sadrži imena za dečake. Skup podataka uključuje podatke za svaku godinu od 1900. do 2012. godine.

Napisati program koji čita svaki fajl i identifikuje sva imena koja su bila najpopularnija najmanje u jednoj godini. Program ispisuje dve liste:
jedna sadrži najpopularnija imena za dečake, a druga za djevojčice. Nijedan spisak ne sadrži ponovljena imena.

fajlovi u folderu:
1900_BoysNames.txt
1900_GirlsNames.txt
1901_BoysNames.txt
1901_GirlsNames.txt
itd.


podaci u fajlu:
John 9830
William 8580
James 7245
George 5403
Charles 4101
Robert 3824
Joseph 3714
Frank 3477
itd.

Ako neko hoće da skine fajlove, ovde su.

Uspeo sam da pokupim unikatna imena iz prvog reda svakog fajla, ali sve u jedan fajl:

Code:
import glob

imena = []

with open('imena.txt2', 'w') as spisak:
    for filename in glob.glob('*.txt'):
        fajl = open(filename, 'r', encoding='utf-8')
        line = fajl.readline().strip().split()
        ime = line[0]
        if ime not in imena:
            imena.append(ime)
    spisak.writelines(str(imena)+'\n')


Kako da selektujem na muška i ženska imena, nemam ideju :(
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste25.03.2020. u 17:02 - pre 48 meseci
Probaj ovako:

Code:

boys = []
girls = []
for filename in glob.glob('*txt'):
     if 'Boys' in filename:
         name = open(filename).readline().split()[0]
         if name not in boys:
             boys.append(name)
     elif 'Girls' in filename:
         name = open(filename).readline().split()[0]
         if name not in girls:
             girls.append(name)

 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.175.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste26.03.2020. u 04:29 - pre 48 meseci
Probao. Radi :)

Znači mogu detaljnije da biram koje će glob fajlove da globi, a ne samo preko ekstenzije.
To nisam bio prokljuvio.

Dobro, sad je kod ovakav

Code:
boys = []
girls = []

with open('decaci.txt2', 'w') as spisak1:
    with open('devojcice.txt2', 'w') as spisak2:
        for filename in glob.glob('*txt'):
             if 'Boys' in filename:
                 name = open(filename).readline().split()[0]
                 if name not in boys:
                     boys.append(name)
             elif 'Girls' in filename:
                 name = open(filename).readline().split()[0]
                 if name not in girls:
                     girls.append(name)
        spisak1.writelines('\n'.join(boys))
        spisak2.writelines('\n'.join(girls))

Pošto se fajlovi u koje upisujem selektovana imena nalaze u istom folderu sa imenima dece, ovaj glob krene da otvara i njih.
Zato sam, kao što vidiš, njihove extenzije promenio u .txt2.

Kako da ovome writelines dam putanju za neki drugi folder gde će upisivati fajlove sa odabranim imenima?
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste26.03.2020. u 06:40 - pre 48 meseci
Citat:
Znači mogu detaljnije da biram koje će glob fajlove da globi, a ne samo preko ekstenzije.

glob vraća listu imena datoteka koje se završavaju sa .txt, dakle isto kao da si napisao: for filename in ['2010_GirlsNames.txt', '1917_BoysNames.txt', itd...]:
Citat:
Kako da ovome writelines dam putanju za neki drugi folder gde će upisivati fajlove sa odabranim imenima?

Navedi putanju u open('/putanja/do/decaci.txt', 'w'), ili putanja = '/putanja/do/decaci.txt', pa onda u open(putanja, 'w') itd...
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.175.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste26.03.2020. u 07:22 - pre 48 meseci
Aha, to sa globom je u stvari onda lista imena fajlova. Kapiram.

Da, sad kad stavim putanju, radi sve kako treba.
Konačno rešenje je ovde.

Hvala, Panto!

Sad mogu da krenem na naredni zadatak....
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste26.03.2020. u 08:32 - pre 48 meseci
Citat:
Sad mogu da krenem na naredni zadatak

Pre nego što kreneš na naredni zadatak, bio bi red da program pored imena ispiše i godine u kojima je ime bilo najpopularnije, kao i broj datih imena. Na primer:
Code:
{'Girls Names': {
    'Emma': {
        '2008': '25809'
    },
    'Emily': {
        '2001': '21113',
        '2002': '21113',
        '2004': '22547',
        '2006': '24811',
        '2003': '27868',
        '2000': '32520',
        '2005': '32520',
        '2007': '24238'
    },
    'Isabella': {
        '2009': '25809'
    }
  },
'Boys Names': {
    'Jacob': {
        '2009': '21113',
        '2002': '30552',
        '2000': '34460',
        '2008': '22547',
        '2006': '24811',
        '2004': '27868',
        '2001': '32520',
        '2007': '24238',
        '2003': '29605',
        '2005': '25809'
  }}
}
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.175.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste26.03.2020. u 11:41 - pre 48 meseci
E ako bi bio red, onda nema druge nego da uradim, samo ako budem umeo :))

"Jer red je red, sve ja to poštujem... "
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.175.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste26.03.2020. u 15:30 - pre 48 meseci
Evo dovde sam stigao.

Program ne prijavljuje nikakvu grešku, ali ništa ni ne upisuje u rečnike.
Negde nešto fali, ali ne mogu da uklavirim šta.

Code:
import glob

decaci = {}
devojcice = {}

with open('c:/FAJLOVI/Python_School/Stephenson_ThePythonWorkbook/decaci.txt2', 'w') as spisak1:
    with open('c:/FAJLOVI/Python_School/Stephenson_ThePythonWorkbook/devojcice.txt2', 'w') as spisak2:
        for filename in glob.glob('*txt'):
             if 'Boys' in filename:
                 name = open(filename).readline().split()[0]
                 broj = open(filename).readline().split()[1]
                 godina = filename[0:4]
                 for k1, v1 in decaci.items():
                     for k2, v2 in v1.items():
                         if name not in v2.keys():
                             decaci['Boys Names'][name][godina] = [broj]
                 
             elif 'Girls' in filename:
                 name = open(filename).readline().split()[0]
                 broj = open(filename).readline().split()[1]
                 godina = filename[0:4]
                 for k1, v1 in devojcice.items():
                     for k2, v2 in v1.items():
                         if name not in v2.keys():
                             devojcice['Girls Names'][name][godina] = [broj]
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste26.03.2020. u 19:56 - pre 48 meseci
Fali svašta. Nema potrebe za tolikim for petljama, ionako u decaci i devojcije dictionary nemaš ništa, a i imaš već for petlju za filename. Ranije gore sam ti pomenu defaultdict iz collections modula koji kreira ključ ukoliko isti ne postoji kako ne bi dobio key error. Na primer:
Code (python):
from collections import defaultdict

decaci = defaultdict(dict)

# ili https://docs.python.org/3/library/stdtypes.html#dict.setdefault
# decaci.setdefault('Boys', {})

for filename in glob.glob('*txt'):
     if 'Boys' in filename:
         name, broj = open(filename).readline().split()
         # broj = open(filename).readline().split()[1]
         godina = filename[:4]
         if name not in decaci['Boys']:
             decaci['Boys'].update({name: {godina: broj}})
         else:
             decaci['Boys'][name].update({godina: broj})


Izlaz:

{'Boys': {
    'David': {'1960': '85928'},
    'Jacob': {
        '1999': '35342',
        '2000': '34460',
        '2001': '32520',
        '2002': '30552',
        '2003': '29605',
        '2004': '27868',
        '2005': '25809',
        '2006': '24811',
        '2007': '24238',
        '2008': '22547',
        '2009': '21113',
        '2010': '22052',
        '2011': '20269',
        '2012': '18899'},
    'James': {
        '1940': '62452',
        '1941': '66714',
        '1942': '77164',
        '1943': '80236',
        '1944': '76936',
        '1945': '74439',
        '1946': '87432',
        '1947': '94743',
        '1948': '88544',
        '1949': '86776', itd...}}})

 
 
Odgovor na temu

B3R1
Berislav Todorovic
NL

Član broj: 224915
Poruke: 794



+630 Profil

icon Re: Zadaci za wannabe pythoniste27.03.2020. u 11:09 - pre 48 meseci
Nisam gledao detaljno, ali ovako na brzinu palo mi je u oci nekliko detalja:
Code:

name = open(filename).readline().split()[0]
broj = open(filename).readline().split()[1]

Fajl se otvara samo jednom, a svaki sledeci poziv funkcije readline() cita sledecu linju iz fajla. Ovako kako si napisao program ce svaki put otvoriti fajl iznova i uvek procitati samo prvu liniju. Ono sto si hteo da uradis je:
Code:

        for filename in glob.glob('*txt'):
             lines = open(filename).readlines()
             if 'Boys' in filename:
                 for line in lines:
                     name = line.strip().split()[0]
                     broj = line.strip().split()[1]
                     godina = filename[0:4]
                     ...

Drugo, cemu ti sluze ove dve petlje na pocetku:
Code:

with open('c:/FAJLOVI/Python_School/Stephenson_ThePythonWorkbook/decaci.txt2', 'w') as spisak1:
    with open('c:/FAJLOVI/Python_School/Stephenson_ThePythonWorkbook/devojcice.txt2', 'w') as spisak2:

Mislim da treba samo da otvoris ta dva fajla za upisivanje bez 'with' strukture. I da svaki put u petlji samo upisujes u njih koristeci write() funkciju - npr:
Code:

spisak1 = open('c:/FAJLOVI/Python_School/Stephenson_ThePythonWorkbook/decaci.txt2', 'w')
spisak2 = open('c:/FAJLOVI/Python_School/Stephenson_ThePythonWorkbook/devojcice.txt2', 'w')
# ... Program ide dalje
# Ispis
...
spisak1.write(promenljiva + '\n')
spisak2.write(promenljiva + '\n')
# OBAVEZNO NA KRAJU:
spisak1.close()
spisak2.close()

Sledeca stvar su dictovi, odnosno hash tabele:
Code:

decaci = {}
...
                 for k1, v1 in decaci.items():
                     for k2, v2 in v1.items():
                         if name not in v2.keys():
                             decaci['Boys Names'][name][godina] = [broj]

Ispravno bi bilo:
Code:

decaci = { 'Boys Names': {} }
                 for k1, v1 in decaci.items():
                     for k2, v2 in v1.items():
                         if name not in v2.keys():
                             decaci['Boys Names'][name] = {}
                         if godina not in decaci['Boys Names'][name] :
                             decaci['Boys Names'][name][godina] = broj

Naime, decaci{} ti je hash tabela ciji je kljuc 'Boys Names', a vrednost nova hash tabela kojoj su kljucevi imena, a vrednosti treca hash tabela ciji su kljucevi godista, a vrednosti frekvencija imena:
Code:

{'Boys Names': {
    'David': {'1960': '85928'},
    'Jacob': {'1999': '35342',  '2000': '34460' }
}}

Da pojasnimo: kada definises hash tabelu decaci kao praznu (decaci = {}), Python ce ti dopustiti da kreiras key:value parove kako god zelis:
Code:

decaci['Mark'] = 1
decaci['Peter'] = 'abc123'
...

Ali kada kazes:
Code:

decaci['Mark']['1976'] = 123

dobijas gresku jer je decaci['Mark'] inicijalizovano kao skalar, a ne kao nova hash tabela. Da bi formirao hash tabelu unutar druge hash tabele moras da najpre kazes da je vrednost kljuca 'Mark' takodje hash tabela:
Code:

decaci['Mark'] = {}
decaci['Mark']['1976'] = 123

Kao sto je Panta rekao, tu moze da ti pomogne defaultdict, mada je daleko cistije raditi postepenu inicijalizaciju, jer se kasnije lakse uocavaju i ispravljaju greske.
Druga stvar koja mi upada u oci je:
Code:

decaci['Boys Names'][name][godina] = [broj]

Ovako kako si napisao ti zapravo dobijas:
{'Boys Names': {
'David': {'1960': ['85928']},
'Jacob': {'1999': ['35342'], '2000': ['34460'] }
}}
Cemu ti sluzi lista kao vrednost u ovom slucaju?

I ono poslednje - godista i frekvencije pojavljivanja imena su numericke vrednosti, pa nema smisla skladistiti ih kao stringove. Numericke vrednosti mogu da se direktno obradjuju. Pre bi imlao smisla:
Code:
name = int(line.strip().split()[0])
broj = int(line.strip().split()[1])

Za kraj jedna zanimljivost: funkcija int(x) u vecini jezika vraca nulu ako x nije numericka vrednost. Npr. int('23') ce biti 23, dok ce int('hello') biti 0. U Pythonu to nije slucaj, int('hello') ce prijaviti gresku. Ja obicno koristim modifikovanu verziju funkcije int() koja izgleda ovako:
Code:

# aint() - The int() function, as we got used in other languagues
def aint(x):
    try:
        retval = int(x)
    except:
        retval = 0
    return retval

I pozivam je sa aint(x) ... vraca nulu ako x nije numericko.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste27.03.2020. u 11:21 - pre 48 meseci
Citat:
a1234567:
Borim se sa zadatkom broj 31:

Podaci se sastoje od preko 200 fajlova. Svaki fajl sadrži spisak od 100 imena koja su u SAD bila najpolularnija u datoj godini, zajedno s brojem upotreba svakog imena. Imena su u fajlu poređana od najviše korišćenog pa naniže. Postoje dva fajla za svaku godinu: jedan sadrži imena koja se koriste za devojčice, a drugi sadrži imena za dečake. Skup podataka uključuje podatke za svaku godinu od 1900. do 2012. godine.

Napisati program koji čita svaki fajl i identifikuje sva imena koja su bila najpopularnija najmanje u jednoj godini. Program ispisuje dve liste:
jedna sadrži najpopularnija imena za dečake, a druga za djevojčice. Nijedan spisak ne sadrži ponovljena imena.

fajlovi u folderu:
1900_BoysNames.txt
1900_GirlsNames.txt
1901_BoysNames.txt
1901_GirlsNames.txt
itd.


podaci u fajlu:
John 9830
William 8580
James 7245
George 5403
Charles 4101
Robert 3824
Joseph 3714
Frank 3477
itd.

Ako neko hoće da skine fajlove, ovde su.

Uspeo sam da pokupim unikatna imena iz prvog reda svakog fajla, ali sve u jedan fajl:

Code:
import glob

imena = []

with open('imena.txt2', 'w') as spisak:
    for filename in glob.glob('*.txt'):
        fajl = open(filename, 'r', encoding='utf-8')
        line = fajl.readline().strip().split()
        ime = line[0]
        if ime not in imena:
            imena.append(ime)
    spisak.writelines(str(imena)+'\n')


Kako da selektujem na muška i ženska imena, nemam ideju :(


Gde se nalaze fajlovi da probam i ja u Rust-u ili Haskell=u ;)?
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste27.03.2020. u 13:28 - pre 48 meseci
"Gde se nalaze fajlovi da probam i ja u Rust-u ili Haskell=u ;)?"

wget --no-check-certificate https://pages.cpsc.ucalgary.ca.../PythonWorkbook/baby_names.zip
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste27.03.2020. u 21:49 - pre 48 meseci
evo ga Rust. Znaci program se nazalizi u diru iznad BabyNames, testirano na Linux-u mozda samo zmaeniti '/' sa '\\' za Windows.
Code:

~/.../examples/rust >>> cat girlsboys.rs                                                                                                                                                                 
use std::io;
use std::fs::File;
use std::fs::read_dir;
use std::io::prelude::*;

fn main()->io::Result<()>{
    let mut maxs_girls:Vec<(i32,String)> = Vec::new();
    let mut maxs_boys:Vec<(i32,String)> = Vec::new();
    let mut max:(i32,String);
    let mut buf = String::new();
    if let Ok(dir) = read_dir("BabyNames") {
        for file in dir {
            let file = file?;
            let mut f = File::open(file.path())?;
            buf.clear();
            let _ = f.read_to_string(&mut buf);
            max = (0,"".to_string());
            for line in buf.lines() {
                let two:Vec<_> = line.split_whitespace().collect();
                if let Ok(number) = two[1].parse::<i32>(){
                    let name = two[0];
                    if max.0 < number {
                        max = (number,name.to_string());
                    }
                }
            }
            let path = file.path();
            let fname = path.to_str().unwrap().to_string();
            let it = fname.split('_').collect::<Vec<_>>();
            let it1 = it[0].split('/').collect::<Vec<_>>();
            let year = it1[1].parse::<i32>().unwrap();
            max.0 = year;
            if it[1] == "GirlsNames.txt" {
                maxs_girls.push(max);
            } else {
                maxs_boys.push(max);
            }
        }
    } else {
        println!("Not in directory above BabyNames...");
    }
    maxs_girls.sort();
    maxs_boys.sort();
    for i in maxs_girls.iter().zip(maxs_boys) {
        println!("{:?}",i);
    }
    Ok(())
}


rezultat:
Code:

~/.../examples/rust >>> ./girlsboys                                                                                                                                                                      
((1900, "Mary"), (1900, "John"))
((1901, "Mary"), (1901, "John"))
((1902, "Mary"), (1902, "John"))
((1903, "Mary"), (1903, "John"))
((1904, "Mary"), (1904, "John"))
((1905, "Mary"), (1905, "John"))
((1906, "Mary"), (1906, "John"))
((1907, "Mary"), (1907, "John"))
((1908, "Mary"), (1908, "John"))
((1909, "Mary"), (1909, "John"))
((1910, "Mary"), (1910, "John"))
((1911, "Mary"), (1911, "John"))
((1912, "Mary"), (1912, "John"))
((1913, "Mary"), (1913, "John"))
((1914, "Mary"), (1914, "John"))
((1915, "Mary"), (1915, "John"))
((1916, "Mary"), (1916, "John"))
((1917, "Mary"), (1917, "John"))
((1918, "Mary"), (1918, "John"))
((1919, "Mary"), (1919, "John"))
((1920, "Mary"), (1920, "John"))
((1921, "Mary"), (1921, "John"))
((1922, "Mary"), (1922, "John"))
((1923, "Mary"), (1923, "John"))
((1924, "Mary"), (1924, "Robert"))
((1925, "Mary"), (1925, "Robert"))
((1926, "Mary"), (1926, "Robert"))
((1927, "Mary"), (1927, "Robert"))
((1928, "Mary"), (1928, "Robert"))
((1929, "Mary"), (1929, "Robert"))
((1930, "Mary"), (1930, "Robert"))
((1931, "Mary"), (1931, "Robert"))
((1932, "Mary"), (1932, "Robert"))
((1933, "Mary"), (1933, "Robert"))
((1934, "Mary"), (1934, "Robert"))
((1935, "Mary"), (1935, "Robert"))
((1936, "Mary"), (1936, "Robert"))
((1937, "Mary"), (1937, "Robert"))
((1938, "Mary"), (1938, "Robert"))
((1939, "Mary"), (1939, "Robert"))
((1940, "Mary"), (1940, "James"))
((1941, "Mary"), (1941, "James"))
((1942, "Mary"), (1942, "James"))
((1943, "Mary"), (1943, "James"))
((1944, "Mary"), (1944, "James"))
((1945, "Mary"), (1945, "James"))
((1946, "Mary"), (1946, "James"))
((1947, "Linda"), (1947, "James"))
((1948, "Linda"), (1948, "James"))
((1949, "Linda"), (1949, "James"))
((1950, "Linda"), (1950, "James"))
((1951, "Linda"), (1951, "James"))
((1952, "Linda"), (1952, "James"))
((1953, "Mary"), (1953, "Robert"))
((1954, "Mary"), (1954, "Michael"))
((1955, "Mary"), (1955, "Michael"))
((1956, "Mary"), (1956, "Michael"))
((1957, "Mary"), (1957, "Michael"))
((1958, "Mary"), (1958, "Michael"))
((1959, "Mary"), (1959, "Michael"))
((1960, "Mary"), (1960, "David"))
((1961, "Mary"), (1961, "Michael"))
((1962, "Lisa"), (1962, "Michael"))
((1963, "Lisa"), (1963, "Michael"))
((1964, "Lisa"), (1964, "Michael"))
((1965, "Lisa"), (1965, "Michael"))
((1966, "Lisa"), (1966, "Michael"))
((1967, "Lisa"), (1967, "Michael"))
((1968, "Lisa"), (1968, "Michael"))
((1969, "Lisa"), (1969, "Michael"))
((1970, "Jennifer"), (1970, "Michael"))
((1971, "Jennifer"), (1971, "Michael"))
((1972, "Jennifer"), (1972, "Michael"))
((1973, "Jennifer"), (1973, "Michael"))
((1974, "Jennifer"), (1974, "Michael"))
((1975, "Jennifer"), (1975, "Michael"))
((1976, "Jennifer"), (1976, "Michael"))
((1977, "Jennifer"), (1977, "Michael"))
((1978, "Jennifer"), (1978, "Michael"))
((1979, "Jennifer"), (1979, "Michael"))
((1980, "Jennifer"), (1980, "Michael"))
((1981, "Jennifer"), (1981, "Michael"))
((1982, "Jennifer"), (1982, "Michael"))
((1983, "Jennifer"), (1983, "Michael"))
((1984, "Jennifer"), (1984, "Michael"))
((1985, "Jessica"), (1985, "Michael"))
((1986, "Jessica"), (1986, "Michael"))
((1987, "Jessica"), (1987, "Michael"))
((1988, "Jessica"), (1988, "Michael"))
((1989, "Jessica"), (1989, "Michael"))
((1990, "Jessica"), (1990, "Michael"))
((1991, "Ashley"), (1991, "Michael"))
((1992, "Ashley"), (1992, "Michael"))
((1993, "Jessica"), (1993, "Michael"))
((1994, "Jessica"), (1994, "Michael"))
((1995, "Jessica"), (1995, "Michael"))
((1996, "Emily"), (1996, "Michael"))
((1997, "Emily"), (1997, "Michael"))
((1998, "Emily"), (1998, "Michael"))
((1999, "Emily"), (1999, "Jacob"))
((2000, "Emily"), (2000, "Jacob"))
((2001, "Emily"), (2001, "Jacob"))
((2002, "Emily"), (2002, "Jacob"))
((2003, "Emily"), (2003, "Jacob"))
((2004, "Emily"), (2004, "Jacob"))
((2005, "Emily"), (2005, "Jacob"))
((2006, "Emily"), (2006, "Jacob"))
((2007, "Emily"), (2007, "Jacob"))
((2008, "Emma"), (2008, "Jacob"))
((2009, "Isabella"), (2009, "Jacob"))
((2010, "Isabella"), (2010, "Jacob"))
((2011, "Sophia"), (2011, "Jacob"))
((2012, "Sophia"), (2012, "Jacob"))


 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste28.03.2020. u 05:16 - pre 48 meseci
@Branimir Maksimovic
Ime ne treba da se ponavlja, samo godine u kojima je ime bilo najpopularnije kao i broj datih imena. Na primer:
Code:
{
'Girls Names': {
    'Emily': {1998: 26177, 1996: 25148, 1997: 25729, 1999: 26535},
    'Jessica': {1993: 34979, 1995: 27938, 1994: 32113, 1990: 46461},
    'Ashley': {1991: 43489, 1992: 38451}},
'Boys Names': {
    'Michael': {1994: 44463, 1995: 41403, 1998: 36608, 1990: 65270,
        1996: 38360, 1992: 54373, 1991: 60782, 1997: 37543, 1993: 49552},
    'Jacob': {1999: 35342}}
}


Code (python):

import glob
from collections import defaultdict

names = defaultdict(dict)

for filename in sorted(glob.glob('*.txt')):
    with open(filename) as f:
        name, name_number = f.readline().split()
    name_number = int(name_number)
    year = int(filename[:4])
    if 'Boys' in filename:
        if name not in names['Boys Names']:
            names['Boys Names'].update( {name: {year: name_number} } )
        else:
            names['Boys Names'][name].update({year: name_number})
    elif 'Girls' in filename:
        if name not in names['Girls Names']:
            names['Girls Names'].update( {name: {year: name_number} })
        else:
            names['Girls Names'][name].update({year: name_number})
 


Zaboravio sam da sortiram listu:
Code:
{
'Boys Names': {
    'Michael': {1990: 65270, 1991: 60782, 1992: 54373, 1993: 49552,
1994: 44463, 1995: 41403, 1996: 38360, 1997: 37543, 1998: 36608},
    'Jacob': {1999: 35342}},
'Girls Names': {
    'Jessica': {1990: 46461, 1993: 34979, 1994: 32113, 1995: 27938},
    'Ashley': {1991: 43489, 1992: 38451},
    'Emily': {1996: 25148, 1997: 25729, 1998: 26177, 1999: 26535}}}


[Ovu poruku je menjao Panta_ dana 28.03.2020. u 06:27 GMT+1]
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste28.03.2020. u 07:46 - pre 48 meseci
Ma poenta je tu sad, kako cu prikazati vise manje nebitno. I u tom sto si prikazao nemas sve godine :P
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste28.03.2020. u 08:05 - pre 48 meseci
Citat:
I u tom sto si prikazao nemas sve godine

Nema zato što sam kopira samo deo izlaza zbog veličine:
Code:
{'Boys Names': {'John': {1900: 9830, 1901: 6899, 1902: 7908, 1903: 7609, 1904: 8108, 1905: 8059, 1906: 8264, 1907: 8983, 1908: 9342, 1909: 9591, 1910: 11451, 1911: 13446, 1912: 24586, 1913: 29324, 1914: 37945, 1915: 47579, 1916: 50046, 1917: 51854, 1918: 56559, 1919: 53530, 1920: 56918, 1921: 58230, 1922: 57268, 1923: 57469}, 'Robert': {1924: 60795, 1925: 60903, 1926: 61113, 1927: 61657, 1928: 60665, 1929: 59799, 1930: 62120, 1931: 60495, 1932: 59240, 1933: 54188, 1934: 55823, 1935: 56509, 1936: 58477, 1937: 61807, 1938: 62261, 1939: 59631, 1953: 86092}, 'James': {1940: 62452, 1941: 66714, 1942: 77164, 1943: 80236, 1944: 76936, 1945: 74439, 1946: 87432, 1947: 94743, 1948: 88544, 1949: 86776, 1950: 86227, 1951: 87099, 1952: 87035}, 'Michael': {1954: 88481, 1955: 88279, 1956: 90611, 1957: 92705, 1958: 90494, 1959: 85285, 1961: 86908, 1962: 85038, 1963: 83794, 1964: 82666, 1965: 81058, 1966: 80008, 1967: 82455, 1968: 82027, 1969: 85226, 1970: 85312, 1971: 77601, 1972: 71420, 1973: 67851, 1974: 67579, 1975: 68453, 1976: 66971, 1977: 67608, 1978: 67139, 1979: 67717, 1980: 68656, 1981: 68733, 1982: 68176, 1983: 67976, 1984: 67703, 1985: 64876, 1986: 64170, 1987: 63625, 1988: 64095, 1989: 65386, 1990: 65270, 1991: 60782, 1992: 54373, 1993: 49552, 1994: 44463, 1995: 41403, 1996: 38360, 1997: 37543, 1998: 36608}, 'David': {1960: 85928}, 'Jacob': {1999: 35342, 2000: 34460, 2001: 32520, 2002: 30552, 2003: 29605, 2004: 27868, 2005: 25809, 2006: 24811, 2007: 24238, 2008: 22547, 2009: 21113, 2010: 22052, 2011: 20269, 2012: 18899}}, 'Girls Names': {'Mary': {1900: 16708, 1901: 13136, 1902: 14486, 1903: 14275, 1904: 14962, 1905: 16067, 1906: 16370, 1907: 17581, 1908: 18666, 1909: 19258, 1910: 22847, 1911: 24388, 1912: 32298, 1913: 36640, 1914: 45345, 1915: 58187, 1916: 61433, 1917: 64280, 1918: 67372, 1919: 65837, 1920: 70978, 1921: 73983, 1922: 72167, 1923: 71630, 1924: 73513, 1925: 70603, 1926: 67830, 1927: 70617, 1928: 66861, 1929: 63500, 1930: 64129, 1931: 60294, 1932: 59865, 1933: 55484, 1934: 56906, 1935: 55068, 1936: 54361, 1937: 55639, 1938: 56202, 1939: 54902, 1940: 56201, 1941: 58023, 1942: 63242, 1943: 66166, 1944: 62468, 1945: 59284, 1946: 67459, 1953: 64330, 1954: 67994, 1955: 63164, 1956: 61750, 1957: 61092, 1958: 55840, 1959: 54473, 1960: 51474, 1961: 47657}, 'Linda': {1947: 99685, 1948: 96178, 1949: 90986, 1950: 80437, 1951: 73884, 1952: 67076}, 'Lisa': {1962: 46085, 1963: 56036, 1964: 54272, 1965: 60262, 1966: 56912, 1967: 52429, 1968: 49528, 1969: 45034}, 'Jennifer': {1970: 46159, 1971: 56785, 1972: 63605, 1973: 62454, 1974: 63106, 1975: 58180, 1976: 59476, 1977: 58961, 1978: 56310, 1979: 56713, 1980: 58383, 1981: 57035, 1982: 57102, 1983: 54335, 1984: 50551}, 'Jessica': {1985: 48343, 1986: 52657, 1987: 55984, 1988: 51523, 1989: 47890, 1990: 46461, 1993: 34979, 1994: 32113, 1995: 27938}, 'Ashley': {1991: 43489, 1992: 38451}, 'Emily': {1996: 25148, 1997: 25729, 1998: 26177, 1999: 26535, 2000: 25953, 2001: 25050, 2002: 24454, 2003: 25682, 2004: 25021, 2005: 23921, 2006: 21381, 2007: 19331}, 'Emma': {2008: 18787}, 'Isabella': {2009: 22257, 2010: 22856}, 'Sophia': {2011: 21780, 2012: 22158}}}
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste28.03.2020. u 08:14 - pre 48 meseci
Ok :
Code:

~/.../examples/rust >>> ./girlsboys                                                                                                                                                                                               
Girls
("Ashley", [(1991, 43489), (1992, 38451)])
("Emily", [(1996, 25148), (1997, 25729), (1998, 26177), (1999, 26535), (2000, 25953), (2001, 25050), (2002, 24454), (2003, 25682), (2004, 25021), (2005, 23921), (2006, 21381), (2007, 19331)])
("Emma", [(2008, 18787)])
("Isabella", [(2009, 22257), (2010, 22856)])
("Jennifer", [(1970, 46159), (1971, 56785), (1972, 63605), (1973, 62454), (1974, 63106), (1975, 58180), (1976, 59476), (1977, 58961), (1978, 56310), (1979, 56713), (1980, 58383), (1981, 57035), (1982, 57102), (1983, 54335), (1984, 50551)])
("Jessica", [(1985, 48343), (1986, 52657), (1987, 55984), (1988, 51523), (1989, 47890), (1990, 46461), (1993, 34979), (1994, 32113), (1995, 27938)])
("Linda", [(1947, 99685), (1948, 96178), (1949, 90986), (1950, 80437), (1951, 73884), (1952, 67076)])
("Lisa", [(1962, 46085), (1963, 56036), (1964, 54272), (1965, 60262), (1966, 56912), (1967, 52429), (1968, 49528), (1969, 45034)])
("Mary", [(1900, 16708), (1901, 13136), (1902, 14486), (1903, 14275), (1904, 14962), (1905, 16067), (1906, 16370), (1907, 17581), (1908, 18666), (1909, 19258), (1910, 22847), (1911, 24388), (1912, 32298), (1913, 36640), (1914, 45345), (1915, 58187), (1916, 61433), (1917, 64280), (1918, 67372), (1919, 65837), (1920, 70978), (1921, 73983), (1922, 72167), (1923, 71630), (1924, 73513), (1925, 70603), (1926, 67830), (1927, 70617), (1928, 66861), (1929, 63500), (1930, 64129), (1931, 60294), (1932, 59865), (1933, 55484), (1934, 56906), (1935, 55068), (1936, 54361), (1937, 55639), (1938, 56202), (1939, 54902), (1940, 56201), (1941, 58023), (1942, 63242), (1943, 66166), (1944, 62468), (1945, 59284), (1946, 67459), (1953, 64330), (1954, 67994), (1955, 63164), (1956, 61750), (1957, 61092), (1958, 55840), (1959, 54473), (1960, 51474), (1961, 47657)])
("Sophia", [(2011, 21780), (2012, 22158)])
Boys
("David", [(1960, 85928)])
("Jacob", [(1999, 35342), (2000, 34460), (2001, 32520), (2002, 30552), (2003, 29605), (2004, 27868), (2005, 25809), (2006, 24811), (2007, 24238), (2008, 22547), (2009, 21113), (2010, 22052), (2011, 20269), (2012, 18899)])
("James", [(1940, 62452), (1941, 66714), (1942, 77164), (1943, 80236), (1944, 76936), (1945, 74439), (1946, 87432), (1947, 94743), (1948, 88544), (1949, 86776), (1950, 86227), (1951, 87099), (1952, 87035)])
("John", [(1900, 9830), (1901, 6899), (1902, 7908), (1903, 7609), (1904, 8108), (1905, 8059), (1906, 8264), (1907, 8983), (1908, 9342), (1909, 9591), (1910, 11451), (1911, 13446), (1912, 24586), (1913, 29324), (1914, 37945), (1915, 47579), (1916, 50046), (1917, 51854), (1918, 56559), (1919, 53530), (1920, 56918), (1921, 58230), (1922, 57268), (1923, 57469)])
("Michael", [(1954, 88481), (1955, 88279), (1956, 90611), (1957, 92705), (1958, 90494), (1959, 85285), (1961, 86908), (1962, 85038), (1963, 83794), (1964, 82666), (1965, 81058), (1966, 80008), (1967, 82455), (1968, 82027), (1969, 85226), (1970, 85312), (1971, 77601), (1972, 71420), (1973, 67851), (1974, 67579), (1975, 68453), (1976, 66971), (1977, 67608), (1978, 67139), (1979, 67717), (1980, 68656), (1981, 68733), (1982, 68176), (1983, 67976), (1984, 67703), (1985, 64876), (1986, 64170), (1987, 63625), (1988, 64095), (1989, 65386), (1990, 65270), (1991, 60782), (1992, 54373), (1993, 49552), (1994, 44463), (1995, 41403), (1996, 38360), (1997, 37543), (1998, 36608)])
("Robert", [(1924, 60795), (1925, 60903), (1926, 61113), (1927, 61657), (1928, 60665), (1929, 59799), (1930, 62120), (1931, 60495), (1932, 59240), (1933, 54188), (1934, 55823), (1935, 56509), (1936, 58477), (1937, 61807), (1938, 62261), (1939, 59631), (1953, 86092)])


program:
Code:

use std::io;
use std::fs::File;
use std::fs::read_dir;
use std::io::prelude::*;
use std::collections::BTreeMap;

fn main()->io::Result<()>{
    let mut maxs_girls:BTreeMap<String,Vec<(i32,i32)>> = BTreeMap::new();
    let mut maxs_boys:BTreeMap<String,Vec<(i32,i32)>> = BTreeMap::new();
    let mut max:(i32,String);
    let mut buf = String::new();
    if let Ok(dir) = read_dir("BabyNames") {
        for file in dir {
            let file = file?;
            let mut f = File::open(file.path())?;
            buf.clear();
            let _ = f.read_to_string(&mut buf);
            max = (0,"".to_string());
            for line in buf.lines() {
                let two:Vec<_> = line.split_whitespace().collect();
                if let Ok(number) = two[1].parse::<i32>(){
                    let name = two[0];
                    if max.0 < number {
                        max = (number,name.to_string());
                    }
                }
            }
            let path = file.path();
            let fname = path.to_str().unwrap().to_string();
            let it = fname.split('_').collect::<Vec<_>>();
            let it1 = it[0].split('/').collect::<Vec<_>>();
            let year = it1[1].parse::<i32>().unwrap();
            if it[1] == "GirlsNames.txt" {
                let r = maxs_girls.entry(max.1).or_insert(Vec::new());
                (*r).push((year,max.0));
                (*r).sort();
            } else {
                let r = maxs_boys.entry(max.1).or_insert(Vec::new());
                (*r).push((year,max.0));
                (*r).sort();
            }
        }
    } else {
        println!("Not in directory above BabyNames...");
    }
    println!("Girls");
    for i in maxs_girls {
        println!("{:?}",i);
    }
    println!("Boys");
    for i in maxs_boys {
        println!("{:?}",i);
    }
    Ok(())
}


 
Odgovor na temu

[es] :: Python :: Zadaci za wannabe pythoniste

Strane: << < .. 16 17 18 19 20 21 22 23 24 25 ... Dalje > >>

[ Pregleda: 50992 | Odgovora: 629 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.