Python vyhladavanie zhody v array

Python vyhladavanie zhody v array
« kdy: 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?


aaa158

  • ***
  • 239
    • Zobrazit profil
    • E-mail
Re:Python vyhladavanie zhody v array
« Odpověď #1 kdy: 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)

Re:Python vyhladavanie zhody v array
« Odpověď #2 kdy: 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"?

Re:Python vyhladavanie zhody v array
« Odpověď #3 kdy: 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)

Re:Python vyhladavanie zhody v array
« Odpověď #4 kdy: 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é.


Re:Python vyhladavanie zhody v array
« Odpověď #5 kdy: 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.

kate

Re:Python vyhladavanie zhody v array
« Odpověď #6 kdy: 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 :)

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Python vyhladavanie zhody v array
« Odpověď #7 kdy: 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é).

Re:Python vyhladavanie zhody v array
« Odpověď #8 kdy: 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.

_Jenda

  • *****
  • 1 550
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Python vyhladavanie zhody v array
« Odpověď #9 kdy: 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).

PanVP

Re:Python vyhladavanie zhody v array
« Odpověď #10 kdy: 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á.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Python vyhladavanie zhody v array
« Odpověď #11 kdy: 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.

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Python vyhladavanie zhody v array
« Odpověď #12 kdy: 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ší.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Python vyhladavanie zhody v array
« Odpověď #13 kdy: 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.

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Python vyhladavanie zhody v array
« Odpověď #14 kdy: 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.
« Poslední změna: 24. 04. 2021, 07:31:41 od Ink »