Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Wangarad 20. 04. 2021, 18:56:55

Název: Python vyhladavanie zhody v array
Přispěvatel: Wangarad 20. 04. 2021, 18:56:55
Zdravim.
Mam pole ovocie['Jablko;1','Pomaranc;2,'Banan;3'] a premenu kosik kde je napriklad Jablko.
Ako vyhladam Jablko v poly ovocie?
Normalne by som pouzil if kosik in ovocie: ale ako vyhladam to ovocie ak je to pole tak ako hore?
Resp. ako vyhladavat ciastocnu "zhodu" v array?
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: aaa158 20. 04. 2021, 19:14:49
Takto ?

Kód: [Vybrat]
>>> ovocie = ["Jablko;1", "Pomaranc;2", "Banan;3"]
>>> for i in ovocie:
...     print (i.startswith( 'Jablko' ))
...
True
False
False

Pripadne: Perl  8)
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: honzik1111 20. 04. 2021, 20:33:44
Mam pole ovocie['Jablko;1','Pomaranc;2,'Banan;3']

i s tím syntax errorem, nebo bez něj? :-)

Resp. ako vyhladavat ciastocnu "zhodu"

Jak máme my vědět co je částečná "shoda"?
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: honzik1111 20. 04. 2021, 20:39:00
Ať jen neplkám, osobně bych to dělal nějak takhle.
Konkrétní "shodu" si vyber / doplň podle svých představ.

Kód: [Vybrat]
pole1  = ['Jablko;1','Pomaranc;2','Banan;3']
pole2  = ['Pomaranc;2','Banan;3']
kosik = "Jablko"

shoda = lambda kosik,prvek: kosik.startswith(prvek)
shoda = lambda kosik,prvek: prvek.startswith(kosik)
shoda = lambda kosik,prvek: kosik in prvek
# shoda = ...

podminka1 = any(shoda(kosik,prvek) for prvek in pole1)
podminka2 = any(shoda(kosik,prvek) for prvek in pole2)
print(podminka1,podminka2)
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: Jan Seifert 20. 04. 2021, 21:27:54
Nevíme, co je přesně cílem, ale asi zjistit, jestli je v košíku nějaké ovoce? Než list je na takové operace lepší set:

Kód: [Vybrat]
In [1]: ovoce = {'Jablko', 'Pomeranc', 'Banan'}

In [2]: zelenina = {'Mrkev', 'Petrzel'}

In [3]: pecivo = {'Chleb', 'Houska'}

In [4]: kosik = {'Jablko', 'Mrkev'}

In [5]: kosik.intersection(ovoce)
Out[5]: {'Jablko'}

In [6]: kosik.intersection(zelenina)
Out[6]: {'Mrkev'}

In [7]: kosik.intersection(pecivo)
Out[7]: set()

Počty, kolik je položek na skladě a kolik v košíku se pak dají držet ve struktuře bokem, nebo ten item zaobjektovat a mít v něm i counter, možnosti jsou různé.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: sarimak 20. 04. 2021, 21:29:30
Jestli budes v listu hledat opakovane, vyplati se ti z nej udelat dict. Ten ma O(1) misto O(N), ale prvotni konverze je O(N) a rozdelene stringy sezerou nejakou pamet. Mrkni se na split(":") a na dict(list of tuples). Rozdel ty stringy na dve casti podle dvojtecky, cast pred dvojteckou poslpuzi jako klic v dictu a druha jako hodnota. Nebo set, pokud te hodnoty nezajimaji.

Jestli hledas jen jednou, je sekvencni hledani se startswith levnejsi.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: kate 21. 04. 2021, 01:14:18
Jestli budes v listu hledat opakovane, vyplati se ti z nej udelat dict. Ten ma O(1) misto O(N), ale prvotni konverze je O(N) a rozdelene stringy sezerou nejakou pamet. Mrkni se na split(":") a na dict(list of tuples). Rozdel ty stringy na dve casti podle dvojtecky, cast pred dvojteckou poslpuzi jako klic v dictu a druha jako hodnota. Nebo set, pokud te hodnoty nezajimaji.

Jestli hledas jen jednou, je sekvencni hledani se startswith levnejsi.

Ještě se vyplatí zamyslet se, kde se ten list vlastně plní. Nejspíš tam dochází k dalšímu O(n) a v tu chvíli je nasypání dat rovnou do dictu lepší bez debat :)
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: Ink 21. 04. 2021, 07:03:45
Napřed si nastuduj https://en.wikipedia.org/wiki/Edit_distance , zejména https://en.wikipedia.org/wiki/Levenshtein_distance

Na Levenshteina existuje v PyPI modul, ale třeba stačí to startswith() nebo je naopak třeba nějaký regulární výraz typu ".*Jablko.*" (tedy modul re v Pythonu). Asi by na to šlo udělat i něco jako index, ale zřejmě se budeš muset spokojit se sekvenčním porovnáváním v seznamu (set apod. nejsou vhodné).
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: Wangarad 21. 04. 2021, 08:14:50
Ono je to torsku zlozitejsie ci len je to v tom liste. Ja potrebujem tu celu hodnotu teda Jablka;1 resp. len to jedna ak su tam jablka. To mi trosku roby problem to vytiahnut cele ked mam value len Jablka.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: _Jenda 21. 04. 2021, 22:42:08
Ono je to torsku zlozitejsie ci len je to v tom liste. Ja potrebujem tu celu hodnotu teda Jablka;1 resp. len to jedna ak su tam jablka. To mi trosku roby problem to vytiahnut cele ked mam value len Jablka.
V tom případě bych začal něčím, co s počítači a programováním zdánlivě nesouvisí: naučit se formulovat problémy a vyjádřit se tak, aby ti ostatní (a koneckonců i ty sám) porozuměli.

startswith() už jsi dostal, a pak ještě split(";"). A pak to taky vypadá jako kdyby ses snažil parsovat nějaké SSV (jako CSV, ale se středníky) nebo jiný formát a na to by bylo lepší použít knihovnu (například jakmile tam bude nějaký escapovaný středník).
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: PanVP 22. 04. 2021, 07:35:50
Formulace problému je skutečně velmi nešťastná.
Divím se, že ti lidé pomáhají - jsou hrozně zapálení.

Já bych se na tebe vyprdnul, pokud bys neuvedl přesnou ukázku pole, jak ho procházíš a co ti to dělá za chybu.

naučit se formulovat problémy a vyjádřit se tak, aby ti ostatní (a koneckonců i ty sám) porozuměli.

Původně mi to přišlo jako poněkud "zlé", ale musím uznat, že máš pravdu.
Ta formulace je opravdu ...dost zmatená.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: qelurg 23. 04. 2021, 06:15:09
Zbytečná diskuse. Správná odpověď byla hned ta první. Ten zbytek je honění si trička nad věcmi, na které se ani neptal.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: Ink 23. 04. 2021, 15:11:49
Zbytečná diskuse. Správná odpověď byla hned ta první. Ten zbytek je honění si trička nad věcmi, na které se ani neptal.

Prosímtě, udělej nám laskavost. Dej původnímu tazateli svůj e-mail a řešte jeho programátorské začátky spolu. Zatímco ostatní se tváří, že si nejsou jisti zadáním, tobě je všechno jasné a tahle cesta bude myslím pro všechny nejpříjemnější.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: qelurg 24. 04. 2021, 07:15:18
Zbytečná diskuse. Správná odpověď byla hned ta první. Ten zbytek je honění si trička nad věcmi, na které se ani neptal.

Prosímtě, udělej nám laskavost. Dej původnímu tazateli svůj e-mail a řešte jeho programátorské začátky spolu. Zatímco ostatní se tváří, že si nejsou jisti zadáním, tobě je všechno jasné a tahle cesta bude myslím pro všechny nejpříjemnější.

Ale houby, aaa158 mu bez zbytečných cavyků odpověděl hned v prvním příspěvku, zbytek si honil tričko a jen zhazoval tazatele. Dotaz je formulovaný dobře a kdo s ním má problém, nechť si dá nějaký kurz čtení a chápání textu. Další dotaz může dotyčný položit zase tady na fóru.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: Ink 24. 04. 2021, 07:29:12
Zbytečná diskuse. Správná odpověď byla hned ta první. Ten zbytek je honění si trička nad věcmi, na které se ani neptal.

Prosímtě, udělej nám laskavost. Dej původnímu tazateli svůj e-mail a řešte jeho programátorské začátky spolu. Zatímco ostatní se tváří, že si nejsou jisti zadáním, tobě je všechno jasné a tahle cesta bude myslím pro všechny nejpříjemnější.

Ale houby, aaa158 mu bez zbytečných cavyků odpověděl hned v prvním příspěvku, zbytek si honil tričko a jen zhazoval tazatele. Dotaz je formulovaný dobře a kdo s ním má problém, nechť si dá nějaký kurz čtení a chápání textu. Další dotaz může dotyčný položit zase tady na fóru.

Spíš máme zkušenosti s tím, že takto "jasné" zadání obyčejně jednak znamená, že autor směřuje k pomalému kódu a podobný "jasný výklad" potenciálně také neřeší všechny okrajové situace. A jelikož je toto veřejné fórum, je ukázání dalších stránek podobných problémů i potenciálním poučením pro ostatní.

Ale jak říkám, pokud mu chceš dělat mentora v takovýchto triviálních úlohách a učit ho podobné prasení, máš možnost. Ideálně v soukromé komunikaci, protože takto položené "problémy" jsou vhodné tak pro kroužek na prvním stupni základky.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: Wangarad 25. 04. 2021, 09:44:15

 Ano v podstate prva odpoved bola spravna ked som si to trosku priohol.
Ink: Nuz zaujimal by ma tvoj skils ked si v principe nic nepovedal s nicim neporadil (a to som si pozrel aj tvoje ine prispevky) ale nuz aj takych majstrov sveta berie autobus. (v kolektive musis byt mega oblubeny a vyhladavany mentor)

Kazdopadne dakujem za tipy a rady zasa som mal moznost sa nieco naucit / zlepsit.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: Wangarad 25. 04. 2021, 10:06:11
Inak som to spravil takto nakoniec.
 
Kód: [Vybrat]
result = [i for i in ovocie if i.startswith(kosik)]
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: Ink 25. 04. 2021, 10:38:26
Ink: Nuz zaujimal by ma tvoj skils ked si v principe nic nepovedal s nicim neporadil

Radit nekomu, aby si prostudoval zakladni metody pro praci se retezci v jazyce, ktery se rozhodl pouzivat, to mi prijde fakt trapne. Pokud jsem v tomto vlaknu neco psal, urcite to nebylo proto, abych ulehcoval praci nekomu, kdo je liny jak ves a neumi ani pouzit Google, ale zneuziva ostatni, aby neco vymysleli za nej.
Název: Re:Python vyhladavanie zhody v array
Přispěvatel: soyo 25. 04. 2021, 15:28:00
Zdar,
a nie je nahodou
Citace
ovocie['Jablko;1','Pomaranc;2,'Banan;3']
iba manualna implementacia enumu alebo namedtuple?

Ako datovy format je to takmer isty zdroj problemov.