Forum » Programiranje » Python permutacije slo. besed
Python permutacije slo. besed
sebas4 ::
Poskušam napraviti programček, ki bi mi izpisal vse možne slovenske besede iz danih črk.
imam kodo:
output mi da vse permutacije črk "dar"
V PyCharm imam v istem project direktoriju tudi datoteko besede.csv
Izmed vseh permutacij sta slovenski besedi samo dar in rad. Ti dve besedi sta tudi na besede.csv
Rad bi da programček pogleda katere izmed vseh permutacij/besed (perm) so na datoteki besede.csv
In kot končni korak print, da izpiše samo take besede.
Rezultat bi torej v tem primeru bil
Ker sem popolni začetnik prosim za beginner friendly pristop.
hvala - ostanite zdravi.
imam kodo:
from itertools import permutations
per = ["".join(p) for p in permutations("dar")]
perms = set(per)
print(perms)
output mi da vse permutacije črk "dar"
{'ard', 'adr', 'dar', 'rda', 'rad', 'dra'}
V PyCharm imam v istem project direktoriju tudi datoteko besede.csv
dar
dare
darko...
.
.
rad
radirka
.
Izmed vseh permutacij sta slovenski besedi samo dar in rad. Ti dve besedi sta tudi na besede.csv
Rad bi da programček pogleda katere izmed vseh permutacij/besed (perm) so na datoteki besede.csv
In kot končni korak print, da izpiše samo take besede.
Rezultat bi torej v tem primeru bil
{'dar', 'rad'}
Ker sem popolni začetnik prosim za beginner friendly pristop.
hvala - ostanite zdravi.
ecton ::
{"".join(p) for p in permutations("dar")}.intersection({"dar", "rad"})
+ https://realpython.com/python-csv/
sebas4 ::
import csv
from itertools import permutations
per = ["".join(p) for p in permutations("dar")]
perms = set(per)
bes = open("besede.csv", "r")
csv.reader(bes)
r = {"".join(p) for p in permutations("dar")}.intersection({bes})
print(r)
bes.close()
in dobim
set()
Process finished with exit code 0
kje je napaka?
Zgodovina sprememb…
- spremenil: sebas4 ()
ecton ::
Narobe beres csv.
Ko debagiras zadeve si sproti printaj rezultate, da potrdis da imas tisto kar mislis da imas. Ali pa uporabi pdb
csv.reader(bes)
Ko debagiras zadeve si sproti printaj rezultate, da potrdis da imas tisto kar mislis da imas. Ali pa uporabi pdb
import csv from itertools import permutations word = "dar" per = {"".join(p) for p in permutations(word)} with open("besede.csv", newline="") as f: reader = csv.reader(f) data = list(reader) words = {w[0] for w in data} result = per.intersection(words) print(result)
sebas4 ::
words = {w[0] for w in data}
File "C:/Users/xxxx/PycharmProjects/wow2/wow2.py", line 11, in <setcomp> words = {w[0] for w in data} IndexError: list index out of range
Še vedno je ena težava. Hvala za namig glede "with open"
sbawe64 ::
https://stackoverflow.com/questions/109...
Vidim tudi da imaš za words: Dictionary {} in znotraj w Array [].
https://www.w3schools.com/python/python...
https://www.w3schools.com/python/python...
Csv ima drugačen format:
https://realpython.com/python-csv/
prej
potem
You are trying to access an element of the list that does not exist.
Vidim tudi da imaš za words: Dictionary {} in znotraj w Array [].
https://www.w3schools.com/python/python...
https://www.w3schools.com/python/python...
V PyCharm imam v istem project direktoriju tudi datoteko besede.csv
dar
dare
darko...
.
.
rad
radirka
Csv ima drugačen format:
https://realpython.com/python-csv/
name,department,birthday month
John Smith,Accounting,November
Erica Meyers,IT,March
prej
with open("besede.csv", newline="") as f: reader = csv.reader(f) data = list(reader)
potem
with open("besede.csv") as f: data= f.read().splitlines()
Zgodovina sprememb…
- spremenilo: sbawe64 ()
sebas4 ::
import csv from itertools import permutations word = "darko" per = {"".join(p) for p in permutations(word)} with open("besede.csv", newline="") as f: reader = csv.reader(f) data = f.read().splitlines() result = per.intersection(data) print(result)
deluje :)
{'korda', 'kodra', 'akord', 'odkar'}
Sedaj pa bi bilo dobro, če bi programček znal poiskati še besede ki so krajše NPR: vnos: DARKO program najde AKORD in ostale besede sestavljene točno iz 5 črk, ne najde pa besed iz manj črk, kot npr: DAR, ODA, KODA...... ITD.
Matek ::
A bi rad, da ti ljudje sprogramirajo rešitev oz. direkt povejo odgovor, al bi rad namige? Nočem težit, iskreno me zanima, kako pomoč bi rad.
Ti je trenutno jasno, kaj delajo posamezni deli tvojega programa in kje nastane problem, zaradi katerega ne najdeš besed z manj črkami?
Ti je trenutno jasno, kaj delajo posamezni deli tvojega programa in kje nastane problem, zaradi katerega ne najdeš besed z manj črkami?
Bolje ispasti glup nego iz aviona.
sebas4 ::
Ni panike, koda z razlago, da lahko stvari razumem, namigi, linki. Vse je uporabno. Kot sem navedel sem začetnik. S pomočjo te teme pa sem npr: spoznal with open način za odpiranje in branje csv in intersection.
garamond ::
Če kaj pomaga - tukaj je seznam slovenskih besed (verjetno vzet iz http://bos.zrc-sazu.si/sbsj.html). Razporejene so takole:
Kot vidiš pa v SSKJ ni besede "Darko".
V tvojem prvem sporočilu si dal primer za črke "dar". Zakaj ni "radar" veljaven rezultat glede na "vse možne slovenske besede iz danih črk"?
{... "aadrr": ["drara", "radar"], "adkor": ["akord", "kodra", "korda", "odkar"], "adr": ["dar", "dra", "rad"], "elrstu": ["luster", "ulster", "ustrel"], "aaeimnrst\u010d": ["marasti\u010den"], ...}Če razporediš vhodne črke po abecedi, boš lahko po ključu tega seznama izpisal možne besede.
Kot vidiš pa v SSKJ ni besede "Darko".
V tvojem prvem sporočilu si dal primer za črke "dar". Zakaj ni "radar" veljaven rezultat glede na "vse možne slovenske besede iz danih črk"?
A parody of extremism is impossible to differentiate from sincere extremism.
sebas4 ::
Kot jaz razumem, koda zgoraj izvede samo permutacije. To pomeni da se ohranja število črk. Če je tvoj vnos iz 3-eh črk, bodo tudi vsi outcomi iz 3-eh črk. Vnos bi bilo verjetno potrebno razbiti na "D", "A", "R" in potem v neki vrstici postaviti range dolžine besed npr, da poišče program vse besed od dolžine treh črk naprej in da lahko posamezne črke vnosa tudi ponovi. Nisem pa še na tem nivoju da bi to spisal.
garamond ::
Mogoče se pa lahko lotiš na obraten način - pri vsaki besedi pogledaš, če ima kakšno *neželjeno* črko. Pvsedokoda ;) :
Predvidi da je tole časovno zelo potratna koda.
Nekdo je že poslal link o Arrayih, potreboval boš metodi append() in pop(), ter break statement znotraj if stavka, znotraj for zanke.
input = "dar" seznam_najdenih_besed = [] z odprto datoteko vseh besed: za vsako besedo (vrstico) v datoteki: dodaj besedo v seznam_najdenih_besed za vsako črko v besedi: če črka ni v input: odstrani zadnjo besedo iz seznam_najdenih_besed break izpiši seznam_najdenih_besedTako bo našlo tudi krajše in daljše besede.
Predvidi da je tole časovno zelo potratna koda.
Nekdo je že poslal link o Arrayih, potreboval boš metodi append() in pop(), ter break statement znotraj if stavka, znotraj for zanke.
A parody of extremism is impossible to differentiate from sincere extremism.
Matek ::
Kot jaz razumem, koda zgoraj izvede samo permutacije. To pomeni da se ohranja število črk. Če je tvoj vnos iz 3-eh črk, bodo tudi vsi outcomi iz 3-eh črk. Vnos bi bilo verjetno potrebno razbiti na "D", "A", "R" in potem v neki vrstici postaviti range dolžine besed npr, da poišče program vse besed od dolžine treh črk naprej in da lahko posamezne črke vnosa tudi ponovi. Nisem pa še na tem nivoju da bi to spisal.Ja, na pravi poti si. Vnos je čisto OK. Razlog, da so vsi rezultati iz treh črk je enostavno ta, da kličeš funkcijo permutations brez drugega argumenta, s katerim bi lahko definiral dolžino permutacij. Recimo:
>>> [p for p in permutations('abc', 2)] [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
Privzeta vrednost za ta argument je enaka dolžini vnosa, zato tudi dobiš samo rezultate dolžine tri. Dodati boš moral torej kodo, ki zgenerira permutacije za vse dolžine od 1 do dolžine vnosa.
Bolje ispasti glup nego iz aviona.
epsilon ::
Mogoče se pa lahko lotiš na obraten način - pri vsaki besedi pogledaš, če ima kakšno *neželjeno* črko. Pvsedokoda ;) :
Tako bo našlo tudi krajše in daljše besede.
input = "dar"
seznam_najdenih_besed = []
z odprto datoteko vseh besed:
za vsako besedo (vrstico) v datoteki:
dodaj besedo v seznam_najdenih_besed
za vsako črko v besedi:
če črka ni v input:
odstrani zadnjo besedo iz seznam_najdenih_besed
break
izpiši seznam_najdenih_besed
Predvidi da je tole časovno zelo potratna koda.
Nekdo je že poslal link o Arrayih, potreboval boš metodi append() in pop(), ter break statement znotraj if stavka, znotraj for zanke.
Če boš želel kasneje to početi tudi na bolj optimalen način (disclaimer: tu gre za naprednejši koncept, ki zahteva nekaj znanja podatkovnih struktur, tako da takole za začetek definitivno ni primeren), podobno dosežeš tudi z uporabo trie-jev - s tem da pri generaciji permutacij dolžine n zraven "zastonj" dobiš zgenerirane tudi vse krajše besede. Se pa splača šele, ko generiraš permutacije dolžine 10 ali več.
Ideja je enostavna: zgeneriraš permutacijo dolžine n in se sprehodiš po drevesu, ki si ga zgradil iz svojega slovarja; ko najdeš črko, ki je hkrati tudi konec besede, jo dodaš v svoj seznam in nadaljuješ po drevesu do dosežene končne dolžine. Še hitreje je sicer, če generiraš permutacije sam z backtrackingom, ker imaš možnost zgodnjega ustavljanja (npr. pri iskanju permutacij "ananas" se ne ukvarjaš z besedami, ki se začnejo z "nn...").
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | program, ki ti najde vse kombinacije črk oz. številk, ki mu jih podaš (strani: 1 2 )Oddelek: Programiranje | 41845 (6537) | XyNOBvxWVJ |
» | Python - pomoč (strani: 1 2 3 )Oddelek: Programiranje | 18035 (8783) | black ice |
» | mysql, permutacije in besede v slovarjuOddelek: Programiranje | 1766 (1456) | Hayabusa |
⊘ | python pomočOddelek: Programiranje | 3405 (2326) | Mavrik |
» | Python, prosim za pomoc pri programiranju (strani: 1 2 3 )Oddelek: Programiranje | 13979 (10081) | lenika |