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

Zadaci za wannabe pythoniste

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

Strane: << < .. 18 19 20 21 22 23 24 25 26 27 ... Dalje > >>

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 04:33 - pre 49 meseci
Citat:
B3R1:
Citat:
a1234567:
"mali" problem da se javljaju neka imena kojih nema u oba spiska za datu godinu (na primer Shannon), al nemam pojma zašto:

Napravio si dve greske. Prva je klasican problem "kumulativnog trpanja" podataka u niz. Problem je sto promenljive lista_m, lista_z i lista_unikat praznis samo na pocetku. Svaki sledeci fajl koji otvoris ih "nasledjuje" u potpunosti i kumulativno dodaje imena u njih. Otuda ti se npr. Shannon, koji se javlja prvi put 1972. godine provlaci i dalje kroz sve naredne godine. Problem zapravo pocinje jos od 1954, gde je Leslie nasledjen(a) iz 1953. i nadalje se provlaci kroz naredne godine. Ok, ovo nije tesko resiti, inicijalizaciju treba ukloniti s vrha i staviti iza linije
lines = open(filename).readlines()
Medjutim, tu postoji jos jedan problem: glob.glob() i os.listdir() vracaju listu fajlova sortiranu po nekoj internoj logici operativnog sistema. Dok Windows sortira fajlove po imenima, Unix/Linux vraca totalno nesortirane fajlove. Znaci, trebalo bi dodati:
for filename in sorted(glob.glob('*txt')):
Na kraju, lepo je sto si iskoristio skup kao strukturu podataka, jer ti to efikasno resava 'uniq' funkciju. Ali sta ce ti onda liste koje pretvaras u skup? Zasto odmah ne koristis skup.add() za dodavanje elementa u skup? Inace, add() funkcija lepo ignorise elemente koji vec postoje u skupu, odnosno dodaje element samo ako vec nije u skupu. Takodje, s obzirom da svaka godina ima muska i zenska imena, nebitno je ispitivati da li je 'Boys' ili 'Girls' u imenu fajla i beleziti posebno muska i zenska imena.

Recimo nesto ovako (nisam testirao, moguce je da sam napravio neki bag, ali ideja je tu):

Code (python):

import glob
spisak = open('c:/FAJLOVI/Python_School/Stephenson_ThePythonWorkbook/unisex.txt', 'w')

imena = {}

for filename in sorted(glob.glob('*txt')):
    godina = int(filename[0:4])
    lines = open(filename).readlines()
    lista= set()                                         # Lista imena u fajlu, pol je nebitan
    for line in lines:
        name = line.strip().split()[0]
        lista.add(name)
    if (godina not in imena):                      # U prvom fajlu iz godine X hashtable imena je prazna
        imena[godina] = lista
    else:                                                  # U drugom fajlu iz godine X trazimo uniq(m,f)
        imena[godina] = imena[godina].intersection(lista)

spisak.write(str(imena) + '\n')
spisak.close()




Da, kad prebacim liste u petlju, radi.
Meni je bila ideja da pokupim sva muška imena u jednu listu, sva ženska u drugu i onda nađem presek te dve liste.

Kod tvog koda mi nisu baš najjasnije neke stvari. Evo kako ga ja čitam:

Code:
for filename in sorted(glob.glob('*txt')):   # OK, sortiranje fajlova pre otvaranja, da bi išlo po godinama, mada kod men u WIn to je već sortirano.
    godina = int(filename[0:4])         # beleži prva 4 karaktera iz imena fajla, što je godina 
    lines = open(filename).readlines()       # učitava u memoriju ceo tekst fajla
    lista= set()                           # tip liste je skup, što znači nema ponavljanja
    for line in lines:      
        name = line.strip().split()[0]         # promenljiva name je indeks[0] u listi, npr. ['James', 32340]
        lista.add(name)                     # dodaje to ime u listu
                                                    OVDE IMAM PROBLEM: kad dovde izvršim program za jednu godinu sa: 
                                                    for filename in sorted(glob.glob('1990*txt')):)
                                                    u listi imam samo ženska imena:

{'Stephanie', 'Maria', 'Lindsay', 'Anna', 'Shannon', 'Julie', 'Hannah', 'Katie', 'Kelly', 'Lindsey', 'Kathleen', 'Ashley', 'Veronica', 
'Mary', 'Angela', 'Elizabeth', 'Cassandra', 'Shelby', 'Tiffany', 'Jenna', 'Brooke', 'Andrea', 'Tara', 'Jessica', 'Katelyn', 'Kelsey', 
'Amy', 'Erin', 'Alicia', 'Alexandra', 'Laura', 'Holly', 'Diana', 'Brianna', 'Gabrielle', 'Kathryn', 'Whitney', 'Sarah', 'Jennifer', 'Catherine',
 'Kristin', 'Emily', 'Amanda', 'Megan', 'Christine', 'Victoria', 'Alyssa', 'Courtney', 'Alexis', 'Erika', 'Melissa', 'Michelle', 'Danielle', 
'Sara', 'Kimberly', 'Katherine', 'Olivia', 'Ariel', 'Cynthia', 'Meghan', 'Rebecca', 'Samantha', 'Monica', 'Patricia', 'Leah', 'Christina', 
'Taylor', 'Julia', 'Morgan', 'Nicole', 'Heather', 'Marissa', 'Brittany', 'Rachel', 'April', 'Kaitlyn', 'Erica', 'Natalie', 'Brittney', 'Vanessa', 
'Caitlin', 'Abigail', 'Lisa', 'Jacqueline', 'Kristen', 'Chelsea', 'Kristina', 'Bianca', 'Molly', 'Alexandria', 'Paige', 'Jamie', 'Jordan', 'Kayla',
'Amber', 'Jasmine', 'Melanie', 'Lauren', 'Allison', 'Crystal'}

Šta se dešava sa muškim imenima? Koji je smisao ove liste?
I onda mi ni ovo što sledi nije jasno:

    if (godina not in imena):                      # U prvom fajlu iz godine X hashtable imena je prazna
        imena[godina] = lista
    else:                                                  # U drugom fajlu iz godine X trazimo uniq(m,f)
        imena[godina] = imena[godina].intersection(lista)
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 04:38 - pre 49 meseci
Citat:
B3R1:
Zadatak broj 33: Kreiranje registra imena u Excelu

Evo mog predloga za novi zadatak, prilicno lak. Oslanja se na iste podatke kao prethodna dva, a sluzi za snalazenje s raspolozivim Python modulima. Od fajlova sa imenima treba napraviti program koji generise tabelu u Excelu u sledecem formatu:

+========+========+======+======+======+
| Name | Gender | 2020 | 2019 | 2018 | ...
+========+========+======+======+======+
| Aice | F | 234 | 234 | 234 |
| Anna | F | 13 | 13 | 13 |
| Bob | M | 1234 | 1234 | 1234 |


Eto nama zabave u karantinu :)))
Ću da probam, pa javljam rezulate...
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 05:53 - pre 49 meseci
Hehe, Beri mi zapaprio, Rust i Haskell nemaju podrsku za excel out of box ;)
Ali ima eksternih biblioteka :P

edit:
nasao za Haskell, za Rust ima samo reader :(

[Ovu poruku je menjao Branimir Maksimovic dana 31.03.2020. u 07:15 GMT+1]
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 05:55 - pre 49 meseci
Citat:
Panto, šta ti je ovo?
for file1, file2 in list(zip(files, files[1:]))[::2]

Šta su ti ovi indeksi [1:] i [::2]?

To je list slicing, valjda si do sada to prošao. Evo primer:
Code:
l = [1, 2, 3, 4, 5, 6]

l[1:]              # od indeksa 1 do kraja, u Pythonu indeksiranje pocinje od 0
[2, 3, 4, 5, 6]

ili sa slice

l[slice(1, None)]
[2, 3, 4, 5, 6]

l[::2]             # svaki drugi
[1, 3, 5]

ili

l[slice(None, None, 2)]
[1, 3, 5]

list(zip(l, l[1:]))
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

Posto mi treba svaki drugi par, na primer za godine (1900, 1901), (1902, 1903), itd...

list(zip(l, l[1:]))[::2]
[(1, 2), (3, 4), (5, 6)]


Isto možeš da koristiš za string i tuple.

https://docs.python.org/2.3/whatsnew/section-slices.html
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 12:36 - pre 49 meseci
Ma znam slajsing, to sam odavno savladao.
Nego mi nije jasna njegova uloga u tvom kodu.
Šta ti znači da čitaš naziv fajla od indeksa [1],
pa svako drugo slovo!?

Al sad vidim da ima nekog smisla.


 
Odgovor na temu

B3R1
Berislav Todorovic
NL

Član broj: 224915
Poruke: 803



+636 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 16:24 - pre 49 meseci
Evo, sad sam ubacio onaj kod koji sam napisao i radi ispravno.

Citat:
a1234567:
Code:

        lista.add(name)                     # dodaje to ime u listu
                                                    OVDE IMAM PROBLEM: kad dovde izvršim program za jednu godinu sa: 
                                                    for filename in sorted(glob.glob('1990*txt')):)
                                                    u listi imam samo ženska imena:

Zato sto si ga izvrsio "dovde". Program se izvrsava od pocetka do kraja. :-) Kada izvrsavas liniju po liniju verovatno dodjes do ove tacke:
Code (python):

>>> import glob
>>>
>>> imena = {}
>>>
>>> for filename in sorted(glob.glob('1910*txt')):
...     godina = int(filename[0:4])
...     lines = open(filename).readlines()
...     lista= set()                                         # Lista imena u fajlu, pol je nebitan
...     for line in lines:
...         name = line.strip().split()[0]
...         lista.add(name)
...

Verovatno si ovde pritisnuo enter, dok je kursor stajao tik uz ove tri tackice, zar ne? Ako si to uradio python je izvrsio spoljasnju for petlju (for filename ...) i u listi si dobio zenska imena, jer su muska ucitana u prvom prolazu petlje. Ako hoces da to proveris, uradi ovo (uh, sad zvucim kao ovi nasi novinski portali - "evo sta vam treba za ovo" ili "ovo vam treba za evo").
Code (python):

>>> import glob
>>>
>>> imena = {}
>>>
>>> for filename in sorted(glob.glob('1910*txt')):
...     print "\nFILE: " + filename
...     godina = int(filename[0:4])
...     lines = open(filename).readlines()
...     lista= set()                                         # Lista imena u fajlu, pol je nebitan
...     for line in lines:
...         name = line.strip().split()[0]
...         lista.add(name)
...     print str(lista)
...

FILE: 1910_BoysNames.txt
set(['Russell', 'Jim', 'Bernard', 'Daniel', 'Stephen', 'Benjamin', 'Theodore', 'Marvin', 'Leonard', 'Fred', 'Philip', 'Homer', 'Luther', 'Louis', 'Michael', 'Herbert', 'Henry', 'Thomas', 'Sam', 'Stanley', 'Paul', 'George', 'Clifford', 'Howard', 'Claude', 'Joseph', 'Alfred', 'John', 'Eugene', 'Lee', 'Frank', 'Everett', 'Samuel', 'Leo', 'William', 'Julius', 'Johnnie', 'Joe', 'Francis', 'Earl', 'Charlie', 'Edgar', 'David', 'Arthur', 'Chester', 'Allen', 'Ernest', 'Clarence', 'Alvin', 'Glenn', 'Roy', 'Oscar', 'Ray', 'Victor', 'Sidney', 'Harvey', 'Robert', 'Elmer', 'Clyde', 'Tom', 'Willie', 'Harold', 'Norman', 'Lawrence', 'Anthony', 'Vernon', 'Floyd', 'Carl', 'Herman', 'Ben', 'Harry', 'Vincent', 'Kenneth', 'Leon', 'Lester', 'Eddie', 'Peter', 'Cecil', 'Jesse', 'Jessie', 'Richard', 'Edwin', 'Ralph', 'Edward', 'Walter', 'Raymond', 'Albert', 'Andrew', 'Jack', 'James', 'Milton', 'Leroy', 'Frederick', 'Morris', 'Martin', 'Lewis', 'Charles', 'Donald', 'Lloyd', 'Melvin'])

FILE: 1910_GirlsNames.txt
set(['Sarah', 'Edith', 'Genevieve', 'Anne', 'Anna', 'Ella', 'Margaret', 'Jennie', 'Beulah', 'Helen', 'Grace', 'Lillian', 'Opal', 'Alice', 'Eleanor', 'Betty', 'Charlotte', 'Carrie', 'Marguerite', 'Pauline', 'Kathryn', 'Marion', 'Rose', 'Rosa', 'Nellie', 'Inez', 'Ellen', 'Sylvia', 'Mary', 'Martha', 'Elizabeth', 'Lucille', 'Theresa', 'Vera', 'Ruby', 'Emma', 'Minnie', 'Mattie', 'Elsie', 'Annie', 'Leona', 'Mamie', 'Doris', 'Agnes', 'Maggie', 'Ethel', 'Josephine', 'Beatrice', 'Clara', 'Thelma', 'Blanche', 'Violet', 'Dorothy', 'Bessie', 'Pearl', 'Ada', 'Ruth', 'Willie', 'Lena', 'Cora', 'Mildred', 'Gladys', 'Katherine', 'Bernice', 'Georgia', 'Eva', 'Velma', 'Jean', 'Ann', 'Lois', 'Marjorie', 'Florence', 'Gertrude', 'Jessie', 'Louise', 'Catherine', 'Viola', 'Laura', 'Esther', 'Sadie', 'Hazel', 'Virginia', 'Frances', 'Mae', 'Marie', 'Alma', 'Lillie', 'Lucy', 'Hattie', 'Ida', 'Myrtle', 'Stella', 'Edna', 'Evelyn', 'Julia', 'Bertha', 'Mabel', 'Lula', 'Fannie', 'Irene'])
 

Kao sto vidis, citaju se oba fajla, jedan za drugim.
Citat:
I onda mi ni ovo što sledi nije jasno:
Code:

    if (godina not in imena):                      # U prvom fajlu iz godine X hashtable imena je prazna
        imena[godina] = lista
    else:                                                  # U drugom fajlu iz godine X trazimo uniq(m,f)
        imena[godina] = imena[godina].intersection(lista)

Hash tabela imena se sastoji od kljuceva koji su godine, a vrednosti su skupovi imena:
{1910: set(['Jessie', 'Willie'])}

Za svaku godinu imas dva fajla - muska i zenska imena. Petlja "for filename in ..." prolazi najpre fajl sa muskim imenima, tu se promenljiva lista napuni imenima iz fajla. Potom ispitujemo da li je godina vec prisutna u hash tabeli (recniku). Ako nije dodajemo je u recnik, a vrednost ce biti skup imena (u ovom slucaju muskih). Potom se petlja "for filename ..." nastavlja citanjem fajla sa zenskim imenima gde se formira nova lista. Kada ponovo izvrsis deo koda "if godina not in imena" - godina ce vec biti definisana u tabeli, pa se izvrsava else, koji menja vrednost - postavlja tako da bude presek skupa muskih imena (trenutna vrednost imena[godina]) i zenskih imena (koja su trenutno u skupu 'lista'). Rezultat za 1910. godinu je:
{1910: set(['Jessie', 'Willie'])}



 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 16:29 - pre 49 meseci
Citat:
Nego mi nije jasna njegova uloga u tvom kodu.
Šta ti znači da čitaš naziv fajla od indeksa [1],
pa svako drugo slovo!?

Al sad vidim da ima nekog smisla.

Da čita iz oba fajla za istu godinu kako bi izdvojio ista imena ukoliko postoje u oba fajla.

Što se tiče Excel tabele:
Code (python):

import glob
import xlsxwriter

data = {}

files = sorted(glob.glob('*.txt'), reverse=True)

for filename in files:
    year = int(filename[:4])
    if 'Boys' in filename:
        gender = 'M'
    else:
        gender = 'F'
    lines = open(filename).readlines()
    for line in lines:
        name, num = line.strip().split()
        name_num = int(num)
        if name not in data:
            data[name] = [gender, (year, name_num)]
        else:
            data[name].append((year, name_num))

book = xlsxwriter.Workbook('BabyNames.xlsx')
sheet = book.add_worksheet("My sheet")

hc = book.add_format({'bg_color': '#e0e0e0'})
gc = book.add_format({'bg_color': '#f9c7ff'})
bc = book.add_format({'bg_color': '#b8bbff'})

sheet.set_row(0, cell_format=hc)
sheet.write(0,0, 'Name')
sheet.write(0,1, 'Gender')
years = sorted(set([i[:4] for i in files]), reverse=True)
col=2
years_cols = {}
for i in years:
    sheet.write(0, col, i)
    years_cols[int(i)]=col
    col+=1

row=1
col=0
for name in sorted(data):
    if data[name][0] == 'F':
        sheet.set_row(row, cell_format=gc)
    else:
        sheet.set_row(row, cell_format=bc)
    sheet.write(row, col, name)
    col+=1
    sheet.write(row, col, data[name][0])
    for i in data[name][1:]:
        sheet.write(row, years_cols[i[0]], i[1])
    row+=1
    col=0
book.close()


Ne radi sa Google docs, jednostavno pomeri sve ćelije ulevo, ako neko želi online da testira, može na https://sheet.zoho.com.

Takođe mora da se instalira xlsxwriter: pip install xlsxwriter

Prikačeni fajlovi
 
Odgovor na temu

B3R1
Berislav Todorovic
NL

Član broj: 224915
Poruke: 803



+636 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 16:32 - pre 49 meseci
Citat:
Branimir Maksimovic:
Hehe, Beri mi zapaprio, Rust i Haskell nemaju podrsku za excel out of box ;)
Ali ima eksternih biblioteka :P

Pa ni Python nema resenje out of the box, vec se koristi modul za to. Zapravo postoje dva, moguce i vise, ali ja znam za jedan koji radi i citanje i pisanje xlsx fajlova. Ideja zadatka je naci modul koji to radi, procitati dokumentaciju, shvatiti kako radi i iskoristiti ga. Dokumentacija sadrzi i gotov primer koji moze da se kopira i iskoristi.

Sad videh da je Panta iskoristio xslxwriter. Meni se vise svidja openpyxl.
Inace, Pandas moze da cita Excel (nisam siguran da li ima podrsku i za generisanje Excel fajlova).
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste31.03.2020. u 17:12 - pre 49 meseci
Znas kako da nadjem C biblioteku koja to radi pa da vrapujem, ne da mi se pored svega posla koji me ceka :P

edit:
bar sam nasao C biblioteku koja se koristi:
https://github.com/jmcnamara/libxlsxwriter

E sad e sad, wrapovati, wrapovati :p
mislim ne mora da bude user friendly ;)


[Ovu poruku je menjao Branimir Maksimovic dana 31.03.2020. u 22:58 GMT+1]
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste01.04.2020. u 02:06 - pre 49 meseci
Citat:
B3R1:
Citat:
Branimir Maksimovic:
Hehe, Beri mi zapaprio, Rust i Haskell nemaju podrsku za excel out of box ;)
Ali ima eksternih biblioteka :P

Pa ni Python nema resenje out of the box, vec se koristi modul za to. Zapravo postoje dva, moguce i vise, ali ja znam za jedan koji radi i citanje i pisanje xlsx fajlova. Ideja zadatka je naci modul koji to radi, procitati dokumentaciju, shvatiti kako radi i iskoristiti ga. Dokumentacija sadrzi i gotov primer koji moze da se kopira i iskoristi.

Sad videh da je Panta iskoristio xslxwriter. Meni se vise svidja openpyxl.
Inace, Pandas moze da cita Excel (nisam siguran da li ima podrsku i za generisanje Excel fajlova).


Koji onda modul da koristim?

Ja sam već instalirao xlsxwriter modul i gledam dokumentaciju.
Napravio sam do pola, ali imam posle stanovitih problema. Što je i za očekivati :)
Ako ih danas ne rešim, postaviću to koliko sam uradio.
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste01.04.2020. u 06:37 - pre 49 meseci
Citat:
Koji onda modul da koristim?

Koji god želiš (openpyxl, xslxwriter, pandas).

Inače, niko nije primetio da sam izostavio (zaboravio) ova zajednička imena za devojčice i dečake Šanon, Džesi, Džordan, Vili, itd. Evo jednostavne ispravke za prethodni kod:
Code (python):
import glob
import xlsxwriter

data = {}

files = sorted(glob.glob('*.txt'), reverse=True)

for filename in files:
    year = int(filename[:4])
    if 'Boys' in filename:
        gender = 'M'
    else:
        gender = 'F'
    lines = open(filename).readlines()
    for line in lines:
        name, name_num = line.strip().split()
        if name in data and gender != data[name][0]:
            if name+'_' not in data:
                data[name+'_'] = [gender, (year, name_num)]
            else:
                data[name+'_'].append((year, name_num))
        elif name not in data:
            data[name] = [gender, (year, name_num)]
        else:
            data[name].append((year, name_num))


book = xlsxwriter.Workbook('/tmp/BabyNames.xlsx')
sheet = book.add_worksheet("My sheet")

hc = book.add_format({'bg_color': '#e0e0e0'})
gc = book.add_format({'bg_color': '#f9c7ff'})
bc = book.add_format({'bg_color': '#b8bbff'})

sheet.set_row(0, cell_format=hc)
sheet.write(0,0, 'Name')
sheet.write(0,1, 'Gender')
years = sorted(set([i[:4] for i in files]), reverse=True)
col=2
years_cols = {}
for i in years:
    sheet.write(0, col, i)
    years_cols[int(i)]=col
    col+=1

row=1
col=0
for name in sorted(data):
    if data[name][0] == 'F':
        sheet.set_row(row, cell_format=gc)
    else:
        sheet.set_row(row, cell_format=bc)
    if '_' in name:
        new_name = name.replace('_', '')
    else:
        new_name = name
    sheet.write(row, col, new_name)
    col+=1
    sheet.write(row, col, data[name][0])
    for i in data[name][1:]:
        sheet.write(row, years_cols[i[0]], i[1])
    row+=1
    col=0
book.close()
 


Mislim da su sada tu sva imena.
Prikačeni fajlovi
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste01.04.2020. u 07:21 - pre 49 meseci
Vidim da xlsxwriter ima defineove za boje? Jel mora bas da u hexa obliku stavljas boje zato sto to nisu definisali kada su wrappovali bilioteku?
 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste01.04.2020. u 08:23 - pre 49 meseci
Može i sa color name, ali mi je ovako bilo lakše da u color picker izaberem boje nego npr. lightblue, lightštaveć.

https://xlsxwriter.readthedocs.io/format.html
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste01.04.2020. u 08:31 - pre 49 meseci
Heh, Panta haker ;)
Nego smorno mi da pravim projekt uvlacim eksterni lib, podesavam build skripte ;)
Da je bar to neko uradio za mene (Rust) pa okacio kao za Python :P
Ipak ovo treba da bude laganica za opustanje ...
 
Odgovor na temu

B3R1
Berislav Todorovic
NL

Član broj: 224915
Poruke: 803



+636 Profil

icon Re: Zadaci za wannabe pythoniste01.04.2020. u 09:36 - pre 49 meseci
Citat:
a1234567:
Koji onda modul da koristim?

Svejedno je. Zapravo, princip kod svih je slican i polazi od same strukture Excel dokumenta, koji se sastoji od radne sveske (workbook) i listova (sheets). Svaki od njih mora da:

* Kreira workbook
* Kreira worksheet
* Za svako polje postavlja boju pozadine, boju slova i ostale atribute i upisuje vrednost.
* Koordinate se odredjuju bilo numericki (npr. (0,0) = prvo polje levo gore) ili u Excel notaciji (npr. A1), zavisno od modula (sto se moze procitati u dokumentaciji).
 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste02.04.2020. u 12:17 - pre 49 meseci
Uzeo sam samo dve prve godine za test i to tek prvih 7-8 imena.
No, svejedno, upletoh se ko pile u kučinu...

Code:
import glob
import xlsxwriter

workbook = xlsxwriter.Workbook('Imena.xlsx')
worksheet = workbook.add_worksheet()

row = 0
col = 0
worksheet.write(row, col, 'Name')
worksheet.write(col, 1, 'Gender')

row = 0
col = 2
files = sorted(glob.glob('*txt'))
for file1, file2 in list(zip(files, files[1:]))[::2]:
    worksheet.write(row, col, file1[0:4])       #upisuje godine
    col += 1

col = 0
row = 1
it = iter(files)
for chunk in zip(it, it):
    for filename in list(chunk):
        if 'Boys' in filename:
            lines = open(filename).readlines()
            for item in lines:
                name = item.strip().split()[0]
                worksheet.write(row, col, name)        # upisuje imena
                worksheet.write(row, col + 1, 'M')      # upisuje pol
                row += 1
        else:
            lines = open(filename).readlines()
            for item in lines:
                name = item.strip().split()[0]
                worksheet.write(row, col, name)
                worksheet.write(row, col + 1, 'F')
                row += 1
col = 2
row = 1
it = iter(files)
for chunk in zip(it, it):
    for txt in list(chunk):
        lines = open(txt).readlines()
        for item in lines:
            broj = item.strip().split()[1]
            worksheet.write(row, col, broj)     # upisuje brojeve
            row += 1
    col += 1

col = 1
row = 1
for filename in files:
    if 'Boys' in filename:
        worksheet.write(row, col, 'M')
        row += 1
    else:
        worksheet.write(row, col, 'F')
        row += 1

workbook.close()

Imam problem kako da ista imena iz naredne godine na upisujem iznova, već samo brojeve za njih.

A ovo je šta trenutno dobijam

 
Odgovor na temu

a1234567

Član broj: 46801
Poruke: 297
136.228.174.*



+3 Profil

icon Re: Zadaci za wannabe pythoniste02.04.2020. u 13:01 - pre 49 meseci
Sad sam pogledao Pantino rešenje, pa vidim da on prvo pravi rečnik, a onda upisuje u tabelu.
A ja krenuo direkt, da ne dangubim
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste04.04.2020. u 17:34 - pre 49 meseci
nije me ipak mrzelo ali nisam pravio posebnu biblioteku nego samo sta koristim.
Potrebno je imati instaliran libxlsxwiter.

Code:

use std::ffi::{CString, CStr};
#[repr(C)]
struct lxw_workbook(*mut lxw_workbook);
#[repr(C)]
struct lxw_worksheet(*mut lxw_worksheet);
#[repr(C)]
#[derive(Clone)]
struct lxw_format(*mut lxw_format);
#[link(name="xlsxwriter",kind="dylib")]
extern "C" {
    fn workbook_new(wkbk: *const i8)->*mut lxw_workbook;
    fn workbook_add_worksheet(wkbk:*mut lxw_workbook, sheetname:*const i8)->*mut lxw_worksheet;
    fn workbook_add_format(wkbk:*mut lxw_workbook)->*mut lxw_format;
    fn workbook_close(wkbk:*mut lxw_workbook)->i32;
    fn lxw_strerror(errnum:i32)->*const i8;
    fn format_set_bg_color(fmt:*mut lxw_format, color: u32);
    fn worksheet_write_string(wksht:*mut lxw_worksheet, row:u32,col:u16,s:*const i8,fmt:*const lxw_format)->i32;
}
impl lxw_workbook {
    fn new(wkbk:&str)->lxw_workbook {
        unsafe {lxw_workbook(workbook_new(CString::new(wkbk).unwrap().as_ptr())) }
    }
    fn add_worksheet(&self,sheetname:&str)->lxw_worksheet {
        unsafe {lxw_worksheet(workbook_add_worksheet(self.0,CString::new(sheetname).unwrap().as_ptr())) }
    }
    fn add_format(&self)->lxw_format {
        unsafe {lxw_format(workbook_add_format(self.0)) }
    }
    fn close(&self)->i32{
        unsafe {workbook_close(self.0)}
    }
    fn strerror(errnum:i32)->&'static str {
        unsafe { CStr::from_ptr(lxw_strerror(errnum)).to_str().unwrap() }
    }
}
impl Drop for lxw_workbook {
    fn drop(&mut self) {
        let rc = self.close();
        if rc != 0 {
            panic!("{}",lxw_workbook::strerror(rc));
        }
    }
}
impl lxw_format {
    fn set_bg_color(&self, color: u32){
        unsafe { format_set_bg_color(self.0,color); }
    }
}
impl lxw_worksheet {
    fn write_string(&self, row:u32, col:u16, s:&str,fmt:lxw_format)->Result<(),String>{
        let s = CString::new(s);
        let rc;
        unsafe { rc = worksheet_write_string(self.0,row,col,s.unwrap().as_ptr(),fmt.0);}
        if rc == 0 {
            Ok(())
        }else {
            Err(lxw_workbook::strerror(rc).to_string())
        }
    }
}

use std::io;
use std::fs::File;
use std::fs::read_dir;
use std::io::prelude::*;
use std::collections::BTreeMap;
type map_t = BTreeMap<i32,i32>;
fn main()->io::Result<()>{
    let mut common:BTreeMap<String,Vec<(char,map_t)>> = BTreeMap::new();
    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())?;
            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();
            let c = if it[1] == "GirlsNames.txt" {
                'F'
            } else {
                'M'
            };
            buf.clear();
            let _ = f.read_to_string(&mut buf);
            for line in buf.lines() {
                let two:Vec<_> = line.split_whitespace().collect();
                let r = common.entry(two[0].to_string()).or_insert(vec!{(c,map_t::new())});
                (*r).last_mut().unwrap().1.insert(year,two[1].parse::<i32>().unwrap());
            }
        }
    } else {
        println!("Not in directory above BabyNames...");
    }
    let wkbk = lxw_workbook::new("example.xlsx");
    let wksht = wkbk.add_worksheet("Names");
    let hc = wkbk.add_format();
    hc.set_bg_color(0xe0e0e0);
    let gc = wkbk.add_format();
    gc.set_bg_color(0xf9c7ff);
    let bc = wkbk.add_format();
    bc.set_bg_color(0xb8bbff);

    let _ = wksht.write_string(0,0, "Name",hc.clone());
    let _ = wksht.write_string(0,1, "Gender",hc.clone());
    for (ord,(name,pair)) in common.iter().enumerate() {
        for (gender,map) in pair.iter() {
            for (ord1,(year,value)) in map.iter().rev().enumerate() {
                let _ = wksht.write_string(0,ord1 as u16+2,year.to_string().as_str(),hc.clone());
                let clr;
                if *gender == 'F' {
                    clr = gc.clone();
                    let _ = wksht.write_string(ord as u32+1,0,name,gc.clone());
                    let _ = wksht.write_string(ord as u32+1,1,"F",gc.clone());
                } else {
                    clr = bc.clone();
                    let _ = wksht.write_string(ord as u32+1,0,name,bc.clone());
                    let _ = wksht.write_string(ord as u32+1,1,"M",bc.clone());
                }
                    let _ = wksht.write_string(ord as u32+1,ord1 as u16+2, value.to_string().as_str(),clr);
                }
            }
        }
    Ok(())
}


 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Zadaci za wannabe pythoniste04.04.2020. u 20:25 - pre 49 meseci
Jedan propust, imena nisam rasporedio po datumima, nego su isla u opadajucem obliku bez obzira na datum,
ispravka:
Code:

use std::ffi::{CString, CStr};
#[repr(C)]
struct lxw_workbook(*mut lxw_workbook);
#[repr(C)]
struct lxw_worksheet(*mut lxw_worksheet);
#[repr(C)]
#[derive(Clone)]
struct lxw_format(*mut lxw_format);
#[link(name="xlsxwriter",kind="dylib")]
extern "C" {
    fn workbook_new(wkbk: *const i8)->*mut lxw_workbook;
    fn workbook_add_worksheet(wkbk:*mut lxw_workbook, sheetname:*const i8)->*mut lxw_worksheet;
    fn workbook_add_format(wkbk:*mut lxw_workbook)->*mut lxw_format;
    fn workbook_close(wkbk:*mut lxw_workbook)->i32;
    fn lxw_strerror(errnum:i32)->*const i8;
    fn format_set_bg_color(fmt:*mut lxw_format, color: u32);
    fn worksheet_write_string(wksht:*mut lxw_worksheet, row:u32,col:u16,s:*const i8,fmt:*const lxw_format)->i32;
}
impl lxw_workbook {
    fn new(wkbk:&str)->lxw_workbook {
        unsafe {lxw_workbook(workbook_new(CString::new(wkbk).unwrap().as_ptr())) }
    }
    fn add_worksheet(&self,sheetname:&str)->lxw_worksheet {
        unsafe {lxw_worksheet(workbook_add_worksheet(self.0,CString::new(sheetname).unwrap().as_ptr())) }
    }
    fn add_format(&self)->lxw_format {
        unsafe {lxw_format(workbook_add_format(self.0)) }
    }
    fn close(&self)->i32{
        unsafe {workbook_close(self.0)}
    }
    fn strerror(errnum:i32)->&'static str {
        unsafe { CStr::from_ptr(lxw_strerror(errnum)).to_str().unwrap() }
    }
}
impl Drop for lxw_workbook {
    fn drop(&mut self) {
        let rc = self.close();
        if rc != 0 {
            panic!("{}",lxw_workbook::strerror(rc));
        }
    }
}
impl lxw_format {
    fn set_bg_color(&self, color: u32){
        unsafe { format_set_bg_color(self.0,color); }
    }
}
impl lxw_worksheet {
    fn write_string(&self, row:u32, col:u16, s:&str,fmt:lxw_format)->Result<(),String>{
        let s = CString::new(s);
        let rc;
        unsafe { rc = worksheet_write_string(self.0,row,col,s.unwrap().as_ptr(),fmt.0);}
        if rc == 0 {
            Ok(())
        }else {
            Err(lxw_workbook::strerror(rc).to_string())
        }
    }
}

use std::io;
use std::fs::File;
use std::fs::read_dir;
use std::io::prelude::*;
use std::collections::BTreeMap;
type map_t = BTreeMap<i32,i32>;
fn main()->io::Result<()>{
    let mut common:BTreeMap<String,Vec<(char,map_t)>> = BTreeMap::new();
    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())?;
            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();
            let c = if it[1] == "GirlsNames.txt" {
                'F'
            } else {
                'M'
            };
            buf.clear();
            let _ = f.read_to_string(&mut buf);
            for line in buf.lines() {
                let two:Vec<_> = line.split_whitespace().collect();
                let r = common.entry(two[0].to_string()).or_insert(vec!{(c,map_t::new())});
                (*r).last_mut().unwrap().1.insert(year,two[1].parse::<i32>().unwrap());
            }
        }
    } else {
        println!("Not in directory above BabyNames...");
    }
    let wkbk = lxw_workbook::new("example.xlsx");
    let wksht = wkbk.add_worksheet("Names");
    let hc = wkbk.add_format();
    hc.set_bg_color(0xe0e0e0);
    let gc = wkbk.add_format();
    gc.set_bg_color(0xf9c7ff);
    let bc = wkbk.add_format();
    bc.set_bg_color(0xb8bbff);
    let mut years = BTreeMap::new();
    for (i,j) in (1900..=2012).rev().enumerate() {
        years.insert(j,i);
        let _ = wksht.write_string(0,i as u16+2,j.to_string().as_str(),hc.clone());
    }
    let _ = wksht.write_string(0,0, "Name",hc.clone());
    let _ = wksht.write_string(0,1, "Gender",hc.clone());
    for (ord,(name,pair)) in common.iter().enumerate() {
        for (gender,map) in pair.iter() {
            for (year,value) in map.iter().rev() {
                let clr;
                if *gender == 'F' {
                    clr = gc.clone();
                    let _ = wksht.write_string(ord as u32+1,0,name,gc.clone());
                    let _ = wksht.write_string(ord as u32+1,1,"F",gc.clone());
                } else {
                    clr = bc.clone();
                    let _ = wksht.write_string(ord as u32+1,0,name,bc.clone());
                    let _ = wksht.write_string(ord as u32+1,1,"M",bc.clone());
                }
                let _ = wksht.write_string(ord as u32+1,years[&*year]as u16+2,value.to_string().as_str(),clr);
            }
        }
    }
    Ok(())
}

 
Odgovor na temu

Panta_
Aleksandar Pantić
Kragujevac

Član broj: 214959
Poruke: 790



+162 Profil

icon Re: Zadaci za wannabe pythoniste06.04.2020. u 07:42 - pre 49 meseci
Citat:
Jedan propust, imena nisam rasporedio po datumima

Zaboravio si i na zajednička imena za devojčice i dečake, tako da recimo imaš Jordan samo za devojčice.
 
Odgovor na temu

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

Strane: << < .. 18 19 20 21 22 23 24 25 26 27 ... Dalje > >>

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

Postavi temu Odgovori

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