Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 629 odgovora
  • 108.357 pregleda

Najnovija ↓

Re: Zadaci za wannabe pythoniste 31.03.2020. u 05:33 · pre 80 meseci #441
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)
Re: Zadaci za wannabe pythoniste 31.03.2020. u 05:38 · pre 80 meseci #442
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...
Re: Zadaci za wannabe pythoniste 31.03.2020. u 06:53 · pre 80 meseci
izmenjeno 1 put, poslednji put Branimir Maksimovic 31.03.2020. u 07:15
  1. Branimir Maksimovic31.03.2020. u 07:15zapis iz teksta poruke
#443
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 :(
Re: Zadaci za wannabe pythoniste 31.03.2020. u 06:55 · pre 80 meseci #444
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
Re: Zadaci za wannabe pythoniste 31.03.2020. u 13:36 · pre 80 meseci #445
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.


Re: Zadaci za wannabe pythoniste 31.03.2020. u 17:24 · pre 80 meseci #446
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'])}



Re: Zadaci za wannabe pythoniste 31.03.2020. u 17:29 · pre 80 meseci #447
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

Sviđa mi se1
Re: Zadaci za wannabe pythoniste 31.03.2020. u 17:32 · pre 80 meseci #448
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).
Re: Zadaci za wannabe pythoniste 31.03.2020. u 18:12 · pre 80 meseci
izmenjeno 1 put, poslednji put Branimir Maksimovic 31.03.2020. u 22:58
  1. Branimir Maksimovic31.03.2020. u 22:58zapis iz teksta poruke
#449
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 ;)
Re: Zadaci za wannabe pythoniste 01.04.2020. u 03:06 · pre 80 meseci #450
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.
Re: Zadaci za wannabe pythoniste 01.04.2020. u 07:37 · pre 80 meseci #451
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.
Re: Zadaci za wannabe pythoniste 01.04.2020. u 08:21 · pre 80 meseci #452
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?
Re: Zadaci za wannabe pythoniste 01.04.2020. u 09:31 · pre 80 meseci #454
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 ...
Re: Zadaci za wannabe pythoniste 01.04.2020. u 10:36 · pre 80 meseci #455
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).
Re: Zadaci za wannabe pythoniste 02.04.2020. u 13:17 · pre 80 meseci #456
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

Re: Zadaci za wannabe pythoniste 02.04.2020. u 14:01 · pre 80 meseci #457
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 :D
Re: Zadaci za wannabe pythoniste 04.04.2020. u 18:34 · pre 80 meseci #458
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(())
}


Re: Zadaci za wannabe pythoniste 04.04.2020. u 21:25 · pre 80 meseci #459
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(())
}

Re: Zadaci za wannabe pythoniste 06.04.2020. u 08:42 · pre 80 meseci #460
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.
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme