» »

[Python] Absolutno varno preverjanje za dictionary key

[Python] Absolutno varno preverjanje za dictionary key

HotBurek ::

Dobro jutro.

Evo, fantje in dekline. Ima sledečo situacijo.

Kot response dobim dictionary, ki lahko da, ali pa lahko da nima določenega key-a.

In pristonost tega keya SKUPAJ z vrednostjo bi rad preveril na absoluten varen način.

Sodaj so štirje primerji.

"test 1" in "test 2" failata: KeyError: 'name'. In tako je tudi pravilno.

Trenutno uporabljam "test 3", ampak mi ni všeč.

Nampreč if a is true and b is true vrača drugačen rezultat kot if b is true and a is true. Se pravi, zaporedje je pomembno. Kar sux, ker ni logično, a vseeno je. In te komplikacije nimam rad.

Zadnji, "test 4", je pa tisto, kar bi jst rekel "moj stil".

Kwa naj sedaj naredim? Je še kakšna druga pocija, da je jasna in preprosta. Da jasno sporoča, what is the catch.

dict1 = { };

# test 1
if dict1["name"] == "test":

    print("a");

# test 2
if dict1["name"] == "test" and "name" in dict1:

    print("a");

# test 3
if "name" in dict1 and dict1["name"] == "test":

    print("a");

# test 4
if "name" in dict1:

    if dict1["name"] == "test":

        print("a");
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Jure14 ::

Naletel si na "kratkostično" računanje logičnih izrazov . "Short-circuit evaluation"

Če imaš izraz "A and B" in se že A izračuna kot false, potem se B sploh ne izračunava.

Verjetno lahko prevajalniku ukažeš, ali logične izraze računa v celoti ali kratkostično.

V tvojem test1 lahko pride do napake, če elementa ni v seznamu.
V test2 prav tako pride do napake pri računanju leve strani AND izraza.
V test3 bo delovalo pravilno, če imaš vklopljeno kratkostično računanje. Ker do napake v desni polovici ne pride, ker se sploh ne začne računat. Ampak to je odvisno od nastavitev prevajalnika.
Test4 je najbolj "ziher".

ViperR ::

Namesto dict["name"] uporabi dict.get("name", 'nič'). To nikol ne vrne errorja.

kr?en ::

A je res treba odpret topic za vsako neumno stvar, namesto, da bi pogledal katere metode ti ponuja dict (get()) in/ali si prebral dokumentacijo: https://docs.python.org/3/tutorial/data...

Itak bo zdaj OP utihnil in ne bo napisal nobenega posta vec.

Zgodovina sprememb…

  • spremenil: kr?en ()

Liker ::

HotBurek je izjavil:


...
Kwa naj sedaj naredim? Je še kakšna druga pocija, da je jasna in preprosta. Da jasno sporoča, what is the catch.

try:
    if dict1["name"] == "test":
        print("a")
    else:
        print("b")
except KeyError:
    print("c")

kr?en ::

Jaz imam obcutek, da je OP navaden troll in samo ragebaita ljudi z glupimi vprasanji.

socialec ::

kr?en je izjavil:

A je res treba odpret topic za vsako neumno stvar, namesto, da bi pogledal katere metode ti ponuja dict (get()) in/ali si prebral

imaš prav, v Loži je res veliko bolj aktivno... mogoče bi bilo smiselno tudi Programiranje zapreti...

kr?en ::

Stupid questions deserve stupid answers.

HotBurek ::

Hvala Jure14. Ja, Python podpira Short-circuit evaluation. Vsaj tako pravijo interneti. Zgleda, da dela tako po defaultu.

Sem sedaj naredil, da uporabljam "test 4", najbolj ziher, edino moteče je, ker se mi neke stvari ponovijo dvakrat. Lahko bi sicer dal del kode v eno funkcijo, in jo dvakrat klical, ampak... ne. Not for now.

if "name" in dict1:

    if dict1["name"] == "test":

        print("a");

    else:

        print("b");
else:

    print("b");
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

socialec ::

There are no stupid questions, only stupid answers.

Če so kakšna vprašanja zares začetniška, se ni potrebno obregati vanje ali v vprašujočega - ki so mu te osnove verjetno jasne ali hitro rešljive - da se ja izgubi prvotni namen foruma, ki je sicer povečini res samo nepomembno nakladanje, ki ga upravitelji dopuščajo izključno zaradi trženjskih interesov.

Zgodovina sprememb…

  • spremenilo: socialec ()

Jure14 ::

Pa malo premeči, pa kakšno pomožno spremenljivko uporabi.

obstaja = ("name" in dict1)
if obstaja then
obstaja = (dict1["name"] == "test")
Endif

if obstaja then
print a
Else print B
Endif


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Try/Except/Finally] - Kako pravilno zapreti povezavo na SQL bazo v Python-u?

Oddelek: Programiranje
171145 (549) jan_g
»

CSV file

Oddelek: Programiranje
262075 (1279) kunigunda
»

[Python3] Sortiranje 2D dict-a?

Oddelek: Programiranje
91340 (1053) marska83
»

Python - pomoč (strani: 1 2 3 )

Oddelek: Programiranje
10318901 (9649) black ice
»

python osnova

Oddelek: Programiranje
212509 (1822) detroit

Več podobnih tem