දී ඇති යතුරක් දැනටමත් ශබ්දකෝෂයක තිබේදැයි පරීක්ෂා කරන්න


2683

යතුර සඳහා අගය යාවත්කාලීන කිරීමට පෙර ශබ්ද කෝෂයක යතුරක් තිබේදැයි පරීක්ෂා කිරීමට මට අවශ්‍ය විය. මම පහත කේතය ලිව්වා:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

මෙම කාර්යය ඉටු කිරීමට හොඳම ක්‍රමය මෙය නොවන බව මම සිතමි. ශබ්ද කෝෂයේ යතුරක් පරීක්ෂා කිරීමට වඩා හොඳ ක්‍රමයක් තිබේද?


31
Docs.python.org/2/library/stdtypes.html#dict.keysdict.keys() ප්‍රලේඛනයට අනුව ඇමතුම් යතුරු ලැයිස්තුවක් නිර්මාණය කරයි, නමුත් මෙම රටාව බැරෑරුම් ලෙස ක්‍රියාත්මක කිරීමේදී පරිවර්තනය කිරීම සඳහා ප්‍රශස්තිකරණය නොකළේ නම් මම පුදුම වෙමි. වෙත . if 'key1' in dict:
එව්ගනි සර්ජිව්

7
අවසානයේදී මම මගේ Python පිටපත් බොහෝ එසේ මන්දගාමී :) වුණේ ඇයි :(. මම භාවිතා ඒක කරන නිසා තියෙනවා කර සොයා ඒ නිසා x in dict.keys()ජාවා යතුරු භාර කැපීපෙනේ කිරීමට සාමාන්ය ක්රමය නිසා ඇති යතුරු සඳහා පරීක්ෂා කිරීමට. තවද එය සිදු වුණේ for (Type k : dict.keySet()), මේ පුරුද්ද ඇති for k in dict.keys()කිරීමට for k in dict(කාර්ය සාධනය අනුව එය තවමත් හොඳ විය යුතුද?) වඩා ස්වාභාවික යැයි හැඟේ , නමුත් පසුව යතුරු පරික්ෂා if k in dict.keys()කිරීමද ගැටලුවක් වේ ...
Evgeni Sergeev

4
DEctgeniSergeev dict_ හි KEYS if k in dict_:හි k පවතින බව පරීක්ෂා කරයි, එබැවින් ඔබට තවමත් අවශ්‍ය නොවේ dict_.keys(). (එය සඳහා එහි පරීක්ෂණ මෙන් මට කියවන ලෙස මෙය මට ටිකක් ඇත වටිනාකම . Dict දී නමුත් එය එසේ නොවේ.)
ToolmakerSteve

1
@ToolmakerSteve එය හරි, නමුත් ඔබට එය අවශ්‍ය නොවනවා පමණක් නොව, එය හොඳ පුරුද්දක් නොවේ.
එව්ගනි සර්ජිව්

26
"Key in dict" උත්සාහ කරන්න
marcelosalloum

Answers:


3417

ina හි යතුරක පැවැත්ම පරීක්ෂා කිරීම සඳහා අපේක්ෂිත ක්‍රමය වේ dict.

d = {"key1": 10, "key2": 23}

if "key1" in d:
    print("this will execute")

if "nonexistent key" in d:
    print("this will not")

ඔබට පෙරනිමියක් අවශ්‍ය නම්, ඔබට සැමවිටම භාවිතා කළ හැකිය dict.get():

d = dict()

for i in range(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

ඔබ හැම විටම ඔබ එක්කෝ භාවිතා කළ හැකි ඕනෑම යතුරක් සඳහා පෙරනිමි අගය තහවුරු කිරීම සඳහා අවශ්ය නම්, dict.setdefault()නැවත නැවතත් හෝ defaultdictසිට collectionsඑසේ මෙන් මොඩියුලය:

from collections import defaultdict

d = defaultdict(int)

for i in range(100):
    d[i % 10] += 1

නමුත් පොදුවේ ගත් කල, inඑය කිරීමට හොඳම ක්‍රමය මූලික පදයයි.


75
මම සාමාන්‍යයෙන් භාවිතා getකරන්නේ මම කෙසේ හෝ ශබ්දකෝෂයෙන් අයිතමය අදින්නට යන්නේ නම් පමණි . භාවිතා කිසිදු අවබෝධයක් in හා ශබ්දකෝෂයන් ඉවත් අයිතමය ඇද.
ජේසන් බේකර්

76
මම සම්පූර්ණයෙන්ම එකඟයි. නමුත් ඔබට දැන ගැනීමට අවශ්‍ය වන්නේ යතුරක් තිබේද යන්න හෝ යතුර නිර්වචනය කර ඇති නඩුවක් සහ ඔබ පෙරනිමියක් භාවිතා කරන අවස්ථාවක් අතර වෙනස හඳුනා ගැනීමට අවශ්‍ය inනම් එය කළ හැකි හොඳම ක්‍රමයයි.
ක්‍රිස් බී.

5
මෙම පිළිතුර සඳහා යොමුව ඇත්තේ පයිතන්
ලියකියවිලි

30
යතුර "අසත්‍යයට" සමාන නම් ලබා ගැනීම නරක පරීක්ෂණයකි, 0උදාහරණයක් ලෙස. මෙය දුෂ්කර ආකාරයකින් ඉගෙන ගත්තේය: /
සෙබස්තියන්

4
යතුරු අසමත් වීමේ සංඛ්‍යාව ප්‍රමාණවත් තරම් කුඩා වන විට 'උත්සාහ කරන්න' - 'හැර' යනු වේගවත්ම බව සඳහන් නොවන බැවින් මෙය සම්පූර්ණ පිළිතුරක් බව මට එකඟ විය නොහැක. මෙම පිළිතුර පහත බලන්න: stackoverflow.com/a/1602945/4376643
ක්‍රේග් හික්ස්

1550

ඔබට යතුරු ඇමතිය යුතු නැත:

if 'key1' in dict:
  print("blah")
else:
  print("boo")

රේඛීය සෙවුමකට වඩා ශබ්ද කෝෂයේ හැෂිං භාවිතා කරන බැවින් එය වඩා වේගවත් වනු ඇත.


7
ඒක නියමයි. එය අභ්‍යන්තරව යතුරු ලැයිස්තුව හරහා ගමන් කරනු ඇතැයි යන හැඟීම මා තුළ පැවතුනි, නමුත් මෙය වැඩ කරන්නේ කට්ටලයක සාමාජිකත්වය පරීක්ෂා කිරීම වැනි ය.
මොහාන් ගුලති

51
O මොහාන් ගුලති: ශබ්දකෝෂයක් යනු අගයන්ට අනුරූප යතුරු යතුරු හැෂ් කළ හැකි බව ඔබට තේරෙනවා නේද? හැෂිං ඇල්ගොරිතමයක් යතුර පූර්ණ සංඛ්‍යාවක් බවට පරිවර්තනය කරන අතර ගැලපෙන හැෂ් වගුවේ ස්ථානයක් සොයා ගැනීමට නිඛිලය භාවිතා කරයි. en.wikipedia.org/wiki/Hash_table
hughdbrown

5
Har චාර්ල්ස් ඇඩිස්, යතුරු මිලියන භාගයක් පමණ වැඩ කිරීමේ අත්දැකීම් වලින් ඔබට “key in dict.keys ()” වෙනුවට “key in dict” ලිවීමේදී අවම වශයෙන් 10x කාර්ය සාධනයක් ලැබෙනු ඇත. ඔබේ ව්‍යාපෘතියට අයහපත් නම් ඔබ ඒවා නොසලකා හැරිය යුතු බව PEP සහ Zen ද සඳහන් කරයි.
ivan_bilan

11
ivan_bilan - මම නිකන් ... මේ මගේ benchtest දිව මිලියන භාගයක් යතුරු මත, if key in d1ගෙන 0.17265701293945312තත්පර. ඇමතුම් if key in d1.keys()ලබා ගත්තේය 0.23871088027954102- මෙය ක්ෂුද්‍ර ප්‍රශස්තිකරණයේ සම්භාව්‍ය අර්ථ දැක්වීමයි. 0.07884883880615234තත්පර ඉතිරි කිරීම කාර්ය සාධනය වැඩි කිරීමක් නොවේ.
චාල්ස් අඩිස්

11
@ එලී ඔබ වෙනුවෙන්ම මම ඔබටම ධාවනය කළ හැකි පරීක්ෂණයක් නිර්මාණය කර ඇත්තෙමි. ප්‍රති results ල ඔබව මවිතයට පත් කළ හැකිය. Key 50,000 යතුරු සහිත නියෝග සඳහා, ඇමතීමෙන් keys()ඔබට තත්පර .01 ක පරිගණක ප්‍රතිලාභයක් ලැබේ. Key 500,000 යතුරු සඳහා, ඇමතීමෙන් keys()ඔබට දෙවන ප්‍රතිලාභය ලැබේ. ~ .5,000,000 යතුරු, කතා කරෙත් නෑ සඳහා keys()වේගවත් තත්පර .4, නමුත් යතුරු 50,000,000 සඳහා ඉදිරිපත් කරන ෙලස keys()වේගවත් තත්පර 3 යනවා!
චාල්ස් අඩිස්

268

In keyword භාවිතා කරමින් ශබ්ද කෝෂයක යතුරක් තිබේදැයි පරීක්ෂා කළ හැකිය :

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

ශබ්දකෝෂයක යතුරක් විකෘති කිරීමට පෙර එහි පැවැත්ම පරීක්ෂා කිරීම සඳහා පොදු භාවිතයක් වන්නේ අගය පෙරනිමියෙන් ආරම්භ කිරීමයි (උදා: ඔබේ අගයන් ලැයිස්තු නම්, උදාහරණයක් ලෙස, ඔබට එකතු කළ හැකි හිස් ලැයිස්තුවක් ඇති බව සහතික කිරීමට ඔබට අවශ්‍යය යතුරක් සඳහා පළමු අගය ඇතුළත් කරන විට). එවැනි අවස්ථාවන්හිදී, ඔබ collections.defaultdict()උනන්දුවක් දක්වන වර්ගය සොයාගත හැකිය.

පැරණි කේත වලදී, has_key()ශබ්දකෝෂවල යතුරු වල පැවැත්ම පරීක්ෂා කිරීම සඳහා අතහැර දැමූ ක්‍රමයක් භාවිතා කළ හැකිය ( key_name in dict_nameඒ වෙනුවට භාවිතා කරන්න).


2
(පයිතන් 2.7 භාවිතා කරමින්) බෙදාහදා ගැනීමට අවශ්‍ය වූයේ, මා විසින් ලියන ලද, ධාවන පථ මත පදනම්ව, 363.235070 “key in dict.keys ()” භාවිතා කරමින්, යතුරු සඳහා වූ ඇමතුම ඉවත් කිරීමෙන් පමණක් 0.260186 දක්වා පහත බැස ඇත. ) "
Ido_f

@Ido_f කරුණාකර ඔබේ මිණුම් සලකුණු පළ කරන්න, මගේ මිණුම් සලකුණු 3.5 සහ 2.7 අතර කිසිදු වෙනසක් නැති නිසා
චාල්ස් ඇඩිස්

@Ido_f එය ඔබගේ වැඩසටහනේ වෙනත් දෙයක් විය හැකි යැයි මම සැක කරමි, නමුත් ඇත්ත වශයෙන්ම නොවේ key in dict.keys(). මෙම චෙක්පත හැර අනෙක් සියලුම කේත ඉවත් කිරීමට උත්සාහ කර ඔබේ ප්‍රති result ලය කුමක්දැයි බලන්න.
චාල්ස් අඩිස්

101

ඔබට මෙය කෙටි කළ හැකිය:

if 'key1' in dict:
    ...

කෙසේ වෙතත්, මෙය හොඳම රූපලාවණ්‍ය වැඩිදියුණු කිරීමකි. මෙය හොඳම ක්‍රමය නොවන බව ඔබ විශ්වාස කරන්නේ ඇයි?


101
මේ බොහෝ රූපලාවණ්ය වැඩි දියුණු කිරීම වඩා. මෙම ක්‍රමය භාවිතා කර යතුරක් සොයා ගැනීමට ගතවන කාලය O (1) වන අතර ඇමතුම් යතුරු මඟින් ලැයිස්තුවක් ජනනය කර O (n) වේ.
ජේසන් බේකර්

5
O (1) තරමක් නිවැරදි බවක් නොපෙනේ. එය O (log n) වැනි දෙයක් නොවන බව ඔබට විශ්වාසද?
වර්ණාවලී

12
එය සාමාන්‍යයෙන් O (1) සහ නරකම O (n) වන තනි නියෝග බැලීමේ සංකීර්ණතාවයි. .list () සෑම විටම O (n) වනු ඇත. wiki.python.org/moin/TimeComplexity
ලියනෝරා ටින්ඩාල්

1
මෙය අමතර වෙන් කිරීමක් ද වළක්වයි. (තද ලූප ටිකක් වේගවත් කිරීම සඳහා වැදගත් වේ)
නියුරෙටින්

57

පිළිගත් පිළිතුරේ යෝජිත ක්‍රම වේගයෙන් ක්‍රියාත්මක කිරීම පිළිබඳ අමතර තොරතුරු සඳහා (මීටර් 10 ලූප):

  • 'key' in mydict ගත වූ කාලය තත්පර 1.07 යි
  • mydict.get('key') ගත වූ කාලය තත්පර 1.84 යි
  • mydefaultdict['key'] ගත වූ කාලය තත්පර 1.07 යි

එබැවින් භාවිතා කිරීම inහෝ defaultdictඊට එරෙහිව නිර්දේශ කරනු ලැබේ get.


6
බව මුළුමනින්ම එකඟ get1.84s <1.07 * 2 ;-P වේ ගේ
පෝල් දැඩි භාවයකින්

54

setdefaultඒ වෙනුවට ක්‍රමය භාවිතා කිරීමට මම නිර්දේශ කරමි . එය ඔබට අවශ්‍ය සියල්ල කරනු ඇති බව පෙනේ.

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}

9
කුමක්ද කරන්නේ setdefaultද විශ්රාම වැටුප් ප්රශ්නයට සමග ද?
hughdbrown

18
ughughdbrown "යතුර සඳහා අගය යාවත්කාලීන කිරීමට පෙර ශබ්ද කෝෂයක යතුරක් තිබේදැයි පරීක්ෂා කිරීමට මට අවශ්‍ය විය." සමහර විට පෝස්ට් වලට ඇතුළත් වන්නේ මුල් ඉලක්කය නොවන දෙයකට ප්‍රතිචාර වේගවත් කරයි. පළමු වාක්‍යයේ සඳහන් ඉලක්කය සපුරා ගැනීම සඳහා, පළ කරන ලද නියැදි කේතය වෙනුවට අතහැර දැමීමක් සිදු නොවුනත්, setdefault වඩාත් method ලදායී ක්‍රමය වේ.
ඩේවිඩ් බර්ජර්

5
මෙය උසස් පිළිතුර වන්නේ එය තාක්‍ෂණිකව නිවැරදි පිළිතුර ලබා දීම වෙනුවට OP හි ඉලක්කය තෘප්තිමත් කරන බැවිනි. බලන්න: nedbatchelder.com/blog/201207/…
නීල්ස් බෝම්

මට යමක් ඉගැන්වූ තොරතුරු සහිත පිළිතුරක් සඳහා +1. කෙසේ වෙතත්, එය හොඳම විසඳුම ද යන්න කෝඩරයේ මනසෙහි ඇති දේ මත රඳා පවතී; උදා: "යතුරේ අගය යාවත්කාලීන කිරීමට පෙර" යන්නෙහි තේරුම. සමහර විට ඔහු එය නොමැති නම් ව්‍යතිරේකයක් විසි කිරීමට යන්නේ (== නව යතුරු එක් කිරීමට අවසර නැත). සමහර විට එය ගණන් කිරීමේ ශබ්ද කෝෂයක් විය හැකි අතර, ඔහු දැනට පවතින ගණන් කිරීම සඳහා 1 ක් එකතු කිරීමට යන්නේ, එම අවස්ථාවේ දී `d [key] = d.get (key, 0) + 1 'යනු පිරිසිදුම විසඳුමයි (ක්‍රිස් පෙන්වන පරිදි, ඔබේ පිළිතුරෙන් පසුව ලියා ඇත). (අනාගත පා readers
කයන්

1
@ToolmakerSteve ඇත්ත. මෙහි ඇති ගැටලුව නම් OP හි ප්‍රශ්නය ප්‍රමාණවත් නොවීමයි.
නීල්ස් බෝම්

45

පයිතන්හි ශබ්දකෝෂයට get ('key', default) ක්‍රමයක් ඇත. යතුරක් නොමැති විට ඔබට පෙරනිමි අගයක් සැකසිය හැකිය.

values = {...}
myValue = values.get('Key', None)

32

EAFP භාවිතා කිරීම ගැන කුමක් කිව හැකිද (අවසරයට වඩා සමාව ඉල්ලීම පහසුය):

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

වෙනත් SO ලිපි බලන්න:

පයිතන් හෝ තිබේ නම් උත්සාහ කරන්න

පයිතන් හි සාමාජික පැවැත්ම පරීක්ෂා කිරීම


12
යතුර බොහෝ විට නොපවතින නම් උත්සාහ කරන්න / හැර මිල අධික විය හැකිය. ඔබ සඳහන් කළ තනතුරෙන්: "[මම] ඔබ සිතන්නේ කාල ප්‍රති result ලයෙන් 99% ක්ම සත්‍ය වශයෙන්ම නැවත ලබා ගත හැකි යමක් අඩංගු වනු ඇතැයි කියාය, මම උත්සාහය / හැර ප්‍රවේශය භාවිතා කරමි. ව්‍යතිරේක සැබවින්ම සුවිශේෂී නම් එය වේගවත් වනු ඇත. ප්‍රති result ලය කිසිවක් නොමැති නම් 50% කට වඩා වැඩි කාලයක්, පසුව භාවිතා කිරීම වඩා හොඳ නම් භාවිතා කිරීම. [...] [A] n ප්‍රකාශය සැමවිටම ඔබට වියදම් කරන්නේ නම්, වාරණයක් හැර / උත්සාහයක් සැකසීමට එය නොමිලේ. නමුත් ව්‍යතිරේකයක් ඇත්ත වශයෙන්ම සිදු වූ විට, පිරිවැය බෙහෙවින් වැඩි ය. stackoverflow.com/a/1835844/1094092
බිල්චාර්ඩ්ස්

28

තෘතීය ක්‍රියාකරු භාවිතා කිරීම:

message = "blah" if 'key1' in dict else "booh"
print(message)

20

ඔබට ප්‍රති results ල ලබා ගත හැකි ක්‍රම:

වඩා හොඳ දේ කරුණු 3 ක් මත රඳා පවතී:

  1. ශබ්ද කෝෂයේ 'සාමාන්‍යයෙන් යතුර තිබේද' හෝ 'සාමාන්‍යයෙන් යතුර නැත'.
  2. If ... else ... elseif ... else වැනි කොන්දේසි භාවිතා කිරීමට ඔබ අදහස් කරනවාද?
  3. ශබ්ද කෝෂය කොතරම් විශාලද?

තව දුරටත් කියවන්න: http://paltman.com/try-except-performance-in-python-a-simple-test/

'In' හෝ 'if' වෙනුවට try / block භාවිතා කිරීම:

try:
    my_dict_of_items[key_i_want_to_check]
except KeyError:
    # Do the operation you wanted to do for "key not present in dict".
else:
    # Do the operation you wanted to do with "key present in dict."

2
පයිතන් 3 සඳහා හොඳ නමුත් අවශ්‍යතාවය සත්‍යාපනය කළ යුතුය. මම වෙබ් පිටුවේ ස්ක්‍රිප්ට් එක සමඟ පරිවර්තනය කළෙමි 2to3.
ජීන් පෝල්

19

පයිතන් 2 පමණි: (සහ පයිතන් 2.7 inදැනටමත් සහය දක්වයි )

ඔබට has_key () ක්‍රමය භාවිතා කළ හැකිය:

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

22
.has_key()කර ඇති අදහසට විරුද්ධ ; inවෙනත් පිළිතුරු වල පෙන්වා ඇති පරිදි ඔබ භාවිතා කළ යුතුය .
බ්‍රැඩ් කොච්

12
BTW, OLD ප්‍රශ්නයකට පිළිතුරු දීමට පෙර පවතින සියලුම පිළිතුරු කියවීමට මම නිර්දේශ කරමි . '09 සිට මයිකල්ගේ පිළිතුරෙහි යෝජනාව දැනටමත් පවතින බැවින් මෙම පිළිතුර කිසිවක් එකතු කළේ නැත. (සාකච්ඡාවකට ප්‍රයෝජනවත් යමක් එකතු කිරීමට දරන උත්සාහය අධෛර්යමත් කිරීමට මම අදහස් නොකරමි. දිගටම උත්සාහ කරන්න.)
මෙවලම් සාදන්නා ස්ටීව්

16

ක්‍රිස්ට එෆ්.අයි.අයි. බී (හොඳම පිළිතුර):

d = defaultdict(int)

එසේම ක්රියා කරයි; හේතුව, int()ප්‍රතිලාභ ඇමතීම තිරය ​​පිටුපස ඇති 0දෙයයි defaultdict(ශබ්දකෝෂයක් තැනීමේදී), එබැවින් ප්‍රලේඛනයේ “කර්මාන්තශාලා ක්‍රියාකාරිත්වය” යන නම.


2
ඔබ ගණන් කිරීමේ ශබ්ද කෝෂයක් නිර්මාණය කරන්නේ නම්, ඔබ භාවිතා කළ යුත්තේ කවුන්ටරය (පයිතන් 2.7 උපකල්පනය කරමින්). සිදුවන්නේ කුමක්ද යන්න වඩාත් පැහැදිලි යැයි මා සිතන නිසා මම defaultdict(lambda: 0)ඒ වෙනුවට භාවිතා defaultdict(int)කළෙමි; 0ඔබ int()තර්කයකින් තොරව ඇමතුමක් ලබා ගන්නේ නම් පා get කයාට දැන ගැනීමට අවශ්‍ය නොවේ . වයි.එම්.එම්.වී.
ක්‍රිස් බී.

9

දී ඇති යතුරක් දැනටමත් ශබ්දකෝෂයක තිබේදැයි පරීක්ෂා කරන්න

එය කරන්නේ කෙසේද යන අදහස ලබා ගැනීම සඳහා අපි මුලින් ශබ්ද කෝෂයෙන් ඇමතිය හැකි ක්‍රම මොනවාදැයි පරීක්ෂා කරමු. මෙන්න ක්‍රම:

d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

Python Dictionary clear()       Removes all Items
Python Dictionary copy()        Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys()    Creates dictionary from given sequence
Python Dictionary get()         Returns Value of The Key
Python Dictionary items()       Returns view of dictionary (key, value) pair
Python Dictionary keys()        Returns View Object of All Keys
Python Dictionary pop()         Removes and returns element having given key
Python Dictionary popitem()     Returns & Removes Element From Dictionary
Python Dictionary setdefault()  Inserts Key With a Value if Key is not Present
Python Dictionary update()      Updates the Dictionary 
Python Dictionary values()      Returns view of all values in dictionary

යතුර දැනටමත් තිබේදැයි පරීක්ෂා කිරීමේ ම්ලේච්ඡ ක්‍රමය මෙම ක්‍රමය විය හැකිය get():

d.get("key")

අනෙක් සිත්ගන්නා ක්‍රම දෙක items()සහ keys()ශබ්දය වැඩ වැඩියි වගේ. එබැවින් get()අපට නිවැරදි ක්‍රමය දැයි විමසා බලමු. අපට අපගේ ආ ict ාව තිබේ d:

d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

මුද්‍රණය කිරීමෙන් අප සතුව නැති යතුර නැවත ලැබෙනු ඇත None:

print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1

යතුර තිබේද නැද්ද යන්න පිළිබඳ තොරතුරු ලබා ගැනීමට අපි එය භාවිතා කළ හැකිය . නමුත් අපි තනි එකක් සමඟ ආ ict ාවක් නිර්මාණය කරන්නේ නම් මෙය සලකා බලන්න key:None:

d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None

get()සමහර අගයන් තිබිය හැකි නම් එම ක්‍රමයට නායකත්වය දීම විශ්වාසදායක නොවේ None. මෙම කතාවට සතුටුදායක අවසානයක් තිබිය යුතුය. අපි inසංසන්දකය භාවිතා කරන්නේ නම් :

print('key' in d) #True
print('key2' in d) #False

අපට නිවැරදි ප්‍රති .ල ලැබේ. අපට පයිතන් බයිට් කේතය පරීක්ෂා කළ හැකිය:

import dis
dis.dis("'key' in d")
#   1           0 LOAD_CONST               0 ('key')
#               2 LOAD_NAME                0 (d)
#               4 COMPARE_OP               6 (in)
#               6 RETURN_VALUE

dis.dis("d.get('key2')")
#   1           0 LOAD_NAME                0 (d)
#               2 LOAD_METHOD              1 (get)
#               4 LOAD_CONST               0 ('key2')
#               6 CALL_METHOD              1
#               8 RETURN_VALUE

මේ අනුව පැහැදිලි inසංසන්දනය ක්රියාකරු පමණක් වඩා විශ්වාසදායක නමුත් පවා වඩා වේගයෙන් නොවේ get().


.get()defaultඅගය සඳහා දෙවන තර්කයක් තිබිය හැකිය, එය ගැටළුව කොතැනද යන්න හැසිරවීමට භාවිතා කළ හැකිය key:None. උදාහරණය: d.get("key", False)
ඇලෙක්ස්

.get()වේගවත්ම ක්‍රමයයි. තවත් විකල්පයක් වන්නේ try/ exceptබ්ලොක්
එකක පැවරීමයි

7

පයිතන් ශබ්දකෝෂය යනුවෙන් හැඳින්වෙන ක්‍රමය __contains__ඇත. ශබ්ද කෝෂයේ යතුර තිබේ නම් මෙම ක්‍රමය සත්‍ය වේ.

 >>> temp = {}

 >>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.

2
__contains__කෙලින්ම ඇමතීම ඉතා නරක පුරුද්දකි . එය කරන්නේ නිවැරදි ආකාරයෙන්, භාවිතා කිරීමයි inමේ වන ක්රියාකරු, containment checkඑම අල්ලාහ් බව __contains__උත්සවය.
user1767754

@ user1767754 මම භාවිතා කරමි foo = x['foo'] if x.__contains__('foo') else 'bar'. inමෙම ප්‍රකාශනයේ කොටසක් ලෙස ක්‍රියාකරු භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ කිසියම් අදහසක් තිබේද?
donrondadon

1
foo = x['foo'] if 'foo' in x else 'bar'
රේ වු

5

බූලියන් ක්‍රියාකරුවන් භාවිතා කරමින් යතුරක් තිබේදැයි පරීක්ෂා කිරීමට තවත් එක් ක්‍රමයක් බෙදා ගැනීම.

d = {'a': 1, 'b':2}
keys = 'abcd'

for k in keys:
    x = (k in d and 'blah') or 'boo'
    print(x) 

මෙය නැවත පැමිණේ

>>> blah
>>> blah
>>> boo
>>> boo

පැහැදිලි කිරීම

පළමුව ඔබ දැන ගත යුතු පිඹුරා, ඒ 0, Noneහෝ ශුන්ය දිග වස්තූන් ඇගයීමට False. අනෙක් සියල්ල ඇගයීමට ලක් කරයිTrue . බූලියන් මෙහෙයුම් වමේ සිට දකුණට තක්සේරු කර ඔපෙරන්ඩ් එක සත්‍ය හෝ අසත්‍ය නොවේ.

උදාහරණයක් බලමු:

>>> 'Some string' or 1/0 
'Some string'
>>>

'Some string'තක්සේරු කරන බැවින් True, ඉතිරි කොටසor ඒවා ඇගයීමට ලක් නොකරන අතර ශුන්‍ය දෝෂයක් මගින් බෙදීමක් නොමැත.

නමුත් අපි මාරුවුවහොත් ඇණවුම 1/0පළමුව ඇගයීමට ලක් කර ව්‍යතිරේකයක් මතු කරයි:

>>> 1/0 or 'Some string'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 

යතුරක් තිබේදැයි පරීක්ෂා කිරීම සඳහා අපට මෙය රටාව සඳහා භාවිතා කළ හැකිය.

(k in d and 'blah')

එසේම කරයි

if k in d:
    'blah'
else:
    False

යතුර තිබේ නම් මෙය දැනටමත් නිවැරදි ප්‍රති result ලය ලබා දෙයි, නමුත් එය නොමැති විට එය 'බූ' මුද්‍රණය කිරීමට අපට අවශ්‍යය. ඉතින්, අපි ප්රති result ලය සහor එය සමඟ'boo'

>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>> 

1

forශබ්දකෝෂය හරහා නැවත යෙදීම සඳහා ඔබට ලූප් භාවිතා කළ හැකි අතර ශබ්ද කෝෂයේ ඔබට සොයා ගැනීමට අවශ්‍ය යතුරේ නම ලබා ගත හැකිය if.

dic = {'first' : 12, 'second' : 123}
for each in dic:
    if each == 'second': 
        print('the key exists and the corresponding value can be updated in the dictionary')

කේතය පිරික්සන්න මේ සඳහා ප්‍රතිදානය it is existසහnot exist
system123456

මෙය රේඛීය සෙවීමක් කිරීමට නම් ශබ්ද කෝෂයක් භාවිතා කරන්නේ ඇයි?
ජීන්-ප්‍රංශුවා ෆැබ්රේ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.