কোনও অভিধানে প্রদত্ত কীটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করে দেখুন


2683

আমি পরীক্ষা করতে চেয়েছিলাম কীটির মানটি আপডেট করার আগে একটি অভিধানে একটি কী উপস্থিত রয়েছে কিনা। আমি নিম্নলিখিত কোডটি লিখেছি:

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

আমি মনে করি এটি এই কাজটি সম্পাদন করার সর্বোত্তম উপায় নয়। অভিধানে কীটির জন্য পরীক্ষা করার আরও ভাল উপায় আছে কি?


31
dict.keys()ডকুমেন্টস.পিথোন.আর / 2 / লাইব্রেরি / স্টাডিটিপস html#dict.keys ডকুমেন্টেশন অনুসারে কলিং কীগুলির একটি তালিকা তৈরি করে তবে আমি অবাক হব যদি এই প্যাটার্নটি অনুবাদ করার জন্য কোনও গুরুতর বাস্তবায়নের জন্য অনুকূলিত না করা হত to if 'key1' in dict:
এভেজেনি সার্জিভ

7
সুতরাং অবশেষে আমি জানতে পেরেছিলাম কেন আমার পাইথন স্ক্রিপ্টগুলির অনেকগুলি ধীরগতির ছিল :) :(! কারণ আমি x in dict.keys()কীগুলি অনুসন্ধান করার জন্য ব্যবহার করছিলাম And এবং এটি ঘটল কারণ জাভাতে কীগুলি নিয়ে পুনরাবৃত্তি করার স্বাভাবিক উপায়টি for (Type k : dict.keySet())এই অভ্যাসের কারণ হয়ে for k in dict.keys()দাঁড়িয়েছে for k in dict(যা পারফরম্যান্সের দিক দিয়ে এখনও ভাল হওয়া উচিত?) এর চেয়ে বেশি প্রাকৃতিক অনুভব করুন তবে কীগুলি পরীক্ষা করা if k in dict.keys()খুব বেশি হয়ে যায়, যা একটি সমস্যা ...
এভেজেনি সার্জিভ

4
@ ইভজেনিসার্জিভ কেকের if k in dict_:উপস্থিতি পরীক্ষার জন্য ডিকের কেইওয়াইস-তে উপস্থিত রয়েছে, সুতরাং আপনার এখনও দরকার নেই dict_.keys()। (এটি আমাকে বিট করেছে, ডিকের মূল্য হিসাবে এটির পরীক্ষার মতো এটি আমার কাছে পড়েছে But তবে তা নয়))
টুলমেকারস্টেভ

1
@ টুলমেকারস্টেভ এটি সঠিক, তবে কেবল এটির প্রয়োজনও নয়, এটি একটি ভাল অনুশীলন নয়।
এভেজেনি সার্জিভ

26
"ডিক ইন কী" চেষ্টা করুন
মার্স্লোসালোলৌম

উত্তর:


3359

inএকটিতে একটি কী এর অস্তিত্বের জন্য পরীক্ষা করার উদ্দেশ্যে করা উপায় 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কীওয়ার্ডটি এটি করার সর্বোত্তম উপায়।


74
আমি সাধারণত getতখনই ব্যবহার করি যদি আমি যেকোন উপায়ে অভিধান থেকে আইটেমটি টানতে যাচ্ছি। অভিধান থেকে আইটেমটি ব্যবহার in এবং টেনে আনতে কোনও বুদ্ধি নেই ।
জেসন বেকার

75
আমি পুরোপুরি একমত. তবে যদি আপনার কেবল কীটি উপস্থিত থাকে কিনা তা জানতে প্রয়োজন, বা কীটি সংজ্ঞায়িত করা হয়েছে এমন একটি ক্ষেত্রে এবং আপনি যেখানে কোনও ডিফল্ট ব্যবহার করছেন এমন একটি ক্ষেত্রে পার্থক্য করতে হবে, inএটি করার সর্বোত্তম উপায়।
ক্রিস বি।

5
এই উত্তরের রেফারেন্সটি পাইথন
ডক্সে রয়েছে

30
কীটি "মিথ্যা" সমতুল্য, 0উদাহরণস্বরূপ , যদি পান তবে এটি একটি খারাপ পরীক্ষা । এই কঠিন উপায়ে শিখেছি: /
সেবাস্তেয়েন

4
আমি একমত হতে পারি না যে এটির সম্পূর্ণ উত্তর হিসাবে উল্লেখ করা হয়নি যে 'চেষ্টা' - 'ব্যতীত' তখনই সবচেয়ে দ্রুত হবে যখন কী ব্যর্থতার সংখ্যা যথেষ্ট কম হবে। এই উত্তরটি নীচে দেখুন: stackoverflow.com/a/1602945/4376643
ক্রেগ হিক্স

1546

আপনাকে কীগুলি কল করতে হবে না:

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

এটি অনেক দ্রুত হবে কারণ এটি অভিধানের হ্যাশিংকে লিনিয়ার অনুসন্ধান করার বিপরীতে ব্যবহার করে, যা কলিং কীগুলি করবে।


7
ওটা দারুন. আমি এমন ছাপে ছিলাম যে এটি অভ্যন্তরীণভাবে কীগুলির তালিকাকেও অতিক্রম করবে তবে আমি দেখতে পাচ্ছি এটি আরও একটি সেটে সদস্যতার পরীক্ষা করার মতো।
মোহন গুলতি

51
@ মোহন গুলতি: আপনি বুঝতে পেরেছেন যে একটি অভিধান মানগুলির ম্যাপযুক্ত কীগুলির হ্যাশটেবল, তাই না? একটি হ্যাশিং অ্যালগরিদম কীটি একটি পূর্ণসংখ্যার সাথে রূপান্তর করে এবং হ্যাশ টেবিলের সাথে মেলে এমন একটি অবস্থান অনুসন্ধান করতে পূর্ণসংখ্যার ব্যবহার করা হয়। en.wikipedia.org/wiki/Hash_table
hughdbrown

5
@ চার্লস অ্যাডিস, প্রায় অর্ধ মিলিয়ন কীগুলির সাথে কাজ করার অভিজ্ঞতা থেকে আপনি "কী ইন ডিক.কিজ ()" এর পরিবর্তে "ডিক ইন কী" লেখার সময় কমপক্ষে 10x পারফরম্যান্স বাড়িয়ে তোলেন। পিইপি এবং জেন আরও বলেছে যে তারা যদি আপনার প্রকল্পের জন্য খারাপ হয় তবে তাদের এড়ানো উচিত।
আইভান_বিলান

11
আইভান_বিলান - আমি এটির জন্য আমার নিজস্ব বেঞ্চেস্ট চালিয়েছি ... অর্ধ মিলিয়ন কীতে কয়েক সেকেন্ড সময় if key in d1নিয়েছে 0.17265701293945312। কলিং if key in d1.keys()নেওয়া গেল 0.23871088027954102- এটি একটি মাইক্রো-অপ্টিমাইজেশনের ক্লাসিক সংজ্ঞা। 0.07884883880615234সেকেন্ড সঞ্চয় করা কোনও পারফরম্যান্সের উত্সাহ নয়।
চার্লস অ্যাডিস

11
@ ইলি শুধু আপনার জন্য আমি একটি পরীক্ষা তৈরি করেছি যাতে আপনি নিজেরাই চালাতে পারেন। ফলাফলগুলি আপনাকে অবাক করে দিতে পারে। ,000 50,000 কী সহ ডিক্টের জন্য, কল না করা keys()আপনাকে .01 দ্বিতীয় গণনা সুবিধা দেয়। 500,000 ডলার কীগুলির জন্য, কল না করা keys()আপনাকে .1 দ্বিতীয় সুবিধা দেয়। ~ 5,000,000 কী জন্য, কলিং না keys().4 সেকেন্ড দ্রুততর, কিন্তু 50.000.000 কী জন্য কলিং keys()3 সেকেন্ড দ্রুততর!
চার্লস অ্যাডিস

268

আপনি একটি অভিধান একটি গুরুত্বপূর্ণ উপস্থিতি পরীক্ষা ব্যবহার করতে পারেন মধ্যে মূল শব্দ:

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
ভাগ করে নিতে চেয়েছিলেন (পাইথন ২.7 ব্যবহার করে) আমি স্রেফ লিখেছি এমন কিছু সময় চালানোর সময়টি, "ডিক.কিজ ইন (কী)" ব্যবহার করে 363.235070 ছিল এবং কেবলমাত্র "কীগুলি" (কল) মুছে ফেলা মাত্র 0.260186 এ চলে গেল ) "
ইডো_ফ

@ আইডো_এফ দয়া করে আপনার মানদণ্ডগুলি পোস্ট করুন, কারণ আমার বেঞ্চমার্কগুলি 3.5 এবং 2.7 এর মধ্যে প্রায় কোনও পার্থক্য নেই
চার্লস অ্যাডিস

@ আইডো_ফ যদি আমার সন্দেহ হয় যে এটি আপনার প্রোগ্রামে অন্যরকম কিছু ছিল যা আসলে অন্য কিছু ছিল তবে বাস্তবে তা নয় key in dict.keys()। এই চেকটি বাদে সমস্ত কোড সরানোর চেষ্টা করুন এবং দেখুন আপনার ফলাফল কী।
চার্লস অ্যাডিস

101

আপনি এটি সংক্ষিপ্ত করতে পারেন:

if 'key1' in dict:
    ...

তবে এটি সর্বোপরি একটি অঙ্গরাগ উন্নতি। কেন আপনি বিশ্বাস করেন যে এটি সর্বোত্তম উপায় নয়?


100
এটি একটি প্রসাধনী উন্নতির চেয়ে অনেক বেশি। এই পদ্ধতিটি ব্যবহার করে কীটি সন্ধান করার সময়টি হল ও (1) যেখানে কলিং কীগুলি একটি তালিকা তৈরি করে এবং ও (এন) হবে।
জেসন বেকার

5
ও (1) বেশ সঠিক বলে মনে হচ্ছে না। আপনি কি নিশ্চিত যে এটি ও (লগ এন) এর মতো কিছু নয়?
বর্ণা্য

12
এটি একক ডিক দেখার জন্য জটিলতা, যা গড়ে ও (1) এবং সবচেয়ে খারাপ ও (এন) হয়। .list () সর্বদা ও (এন) থাকবে। wiki.python.org/moin/TimeComplexity
Leonora Tindall

1
এটি অতিরিক্ত বরাদ্দও এড়িয়ে যায়। (কিছুটা দ্রুত
টান

56

গৃহীত উত্তরের প্রস্তাবিত পদ্ধতিগুলির (10 মিটার লুপ) গতি সম্পাদনের বিষয়ে অতিরিক্ত তথ্যের জন্য:

  • 'key' in mydict অতিবাহিত সময় 1.07 সেকেন্ড
  • mydict.get('key') অতিবাহিত সময় 1.84 সেকেন্ড
  • mydefaultdict['key'] অতিবাহিত সময় 1.07 সেকেন্ড

অতএব ব্যবহার inবা defaultdictবিরুদ্ধে সুপারিশ করা হয় get


6
সম্পূর্ণরূপে সম্মত হন যে get1.84 এর দশকে <1.07 * 2 ;
পল রিগোর

54

আমি setdefaultপরিবর্তে পদ্ধতিটি ব্যবহার করার পরামর্শ দেব । মনে হচ্ছে এটি আপনার যা কিছু করবে তা করবে will

>>> 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ওপির প্রশ্নের সাথে কী করতে হবে?
হুগড্রাউনটি

18
@hughdbrown "আমি কীটির মান আপডেট করার আগে অভিধানে একটি কী উপস্থিত থাকলে তা পরীক্ষা করে দেখতে চেয়েছিলাম।" কখনও কখনও পোস্টগুলিতে এমন কোড অন্তর্ভুক্ত থাকে যা এমন কোনও কিছুতে প্রতিক্রিয়া সৃষ্টি করে যা মূল লক্ষ্য নয়। প্রথম বাক্যে বর্ণিত লক্ষ্যটি অর্জন করতে, সেটডেফল্ট সর্বাধিক কার্যকর পদ্ধতি, যদিও এটি পোস্ট করা নমুনা কোডটির জন্য ড্রপ-ইন প্রতিস্থাপন নয়।
ডেভিড বার্গার

5
এটি সর্বোত্তম উত্তর কারণ এটি কেবল প্রযুক্তিগতভাবে সঠিক উত্তর দেওয়ার পরিবর্তে ওপির লক্ষ্য পূরণ করে। দেখুন: nedbatchelder.com/blog/201207/…
নিলস বম

তথ্যমূলক উত্তরের জন্য +1, যা আমাকে কিছু শিখিয়েছে। যাইহোক, এটি সর্বোত্তম সমাধান কিনা কোডার মনে রাখে তার উপর নির্ভর করে; যেমন "কীটির মান আপডেট করার আগে" এর অর্থ। এটি উপস্থিত না থাকলে সম্ভবত তিনি ব্যতিক্রম করতে যাচ্ছেন (== নতুন কী যুক্ত করার অনুমতি নেই)। সম্ভবত এটি গণনাগুলির একটি অভিধান, এবং তিনি বিদ্যমান গণিতে 1 যোগ করতে চলেছেন, সেই ক্ষেত্রে `d [key] = d.get (কী, 0) + 1 'সবচেয়ে পরিষ্কার সমাধান (ক্রিস যেমন দেখায়, আপনার উত্তরের পরে) লেখা হয়েছিল). (আমি কেবল এটি উল্লেখ করে বিরক্ত করছি, ভবিষ্যতের পাঠকরা এখানে বিভিন্ন কাজের কথা মাথায় রেখে আসেন।)
টুলমেকারস্টেভ

1
পছন্দ করুন এখানে সমস্যাটি হ'ল ওপির প্রশ্নটি যথেষ্ট পরিষ্কার ছিল না।
নীলস বম

45

পাইথনের অভিধানে একটি গেট ('কী', ডিফল্ট) পদ্ধতি রয়েছে। কোনও চাবি না থাকলে আপনি কেবল একটি ডিফল্ট মান সেট করতে পারেন।

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

33

ইএএফপি ব্যবহার সম্পর্কে (অনুমতি চেয়ে ক্ষমা চাওয়া আরও সহজ):

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

অন্যান্য এসও পোস্টগুলি দেখুন:

অজগর বা যদি চেষ্টা বনাম ব্যবহার করে

পাইথনে সদস্য অস্তিত্বের জন্য অনুসন্ধান করা হচ্ছে


12
চেষ্টা করুন / বাদে আরও ব্যয়বহুল হতে পারে যদি সম্ভবত এটি প্রায়শই উপস্থিত না থাকে। আপনি যে পোস্টটি উল্লেখ করেছেন তা থেকে: "[আমি] চ আপনি প্রত্যাশা করেছেন যে সময়ের ফলাফলের 99% আসলে পুনরাবৃত্তিযোগ্য কিছু ধারণ করে রাখে, আমি চেষ্টাটি ব্যবহার করি / পদ্ধতি ব্যতীত ব্যবহার করব। ব্যতিক্রমগুলি সত্যই ব্যতিক্রমী হলে তা দ্রুত হবে If ফলাফল যদি কিছুই না হয় তবে ৫০% এরও বেশি সময়, তারপরে ব্যবহার করা সম্ভবত আরও ভাল [[...] [এ] এন যদি বিবৃতি সর্বদা আপনার জন্য ব্যয় করে তবে ব্লক ব্যতীত চেষ্টা করে / সেট আপ করা প্রায় বিনামূল্যে। তবে যখন কোনও ব্যতিক্রম আসলে ঘটে তখন খরচ অনেক বেশি। " stackoverflow.com/a/1835844/1094092
billrichards

28

টার্নারি অপারেটর ব্যবহার:

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

20

আপনি যে ফলাফলগুলি পেতে পারেন সেগুলি হ'ল:

কোনটি ভাল তা 3 টি বিষয়ের উপর নির্ভরশীল:

  1. অভিধানটিতে 'সাধারণত কী থাকে' বা 'সাধারণত কী থাকে না'।
  2. আপনি যদি ... অন্য ... অন্যথায় ... অন্যরকম শর্তগুলি ব্যবহার করার পরিকল্পনা করেন?
  3. অভিধান কত বড়?

আরও পড়ুন: http://paltman.com :

'ইন' বা 'যদি' এর পরিবর্তে চেষ্টা / ব্লক ব্যবহার করুন:

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. জন্য actualized করা প্রয়োজন আমি ওয়েব পৃষ্ঠার স্ক্রিপ্ট রূপান্তরিত 2to3দেখল য়ে ছাড়া চেষ্টা সিনট্যাক্স সবসময় দ্রুততর করে দেখুন সিনট্যাক্স সঙ্গে তুলনায়, এমনকি যদি যেখানে মূল অভি হয় হবে।
জিন পল

18

পাইথন 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
বিটিডাব্লু, আমি উত্তর দেওয়ার আগে একটি পুরানো প্রশ্নের সমস্ত বিদ্যমান উত্তরগুলি পড়ার পরামর্শ দিচ্ছি । এই উত্তরটি আর কিছুই যোগ করতে পারেনি, যেহেতু পরামর্শটি মাইকের উত্তরটিতে ইতিমধ্যে বিদ্যমান ছিল, '09 থেকে। (আমি আলোচনায় দরকারী কিছু যুক্ত করার প্রয়াসকে নিরুৎসাহিত করতে চাইছি না। চেষ্টা চালিয়ে যান।)
টুলমেকারস্টেভ

16

ক্রিসে কেবল একটি এফওয়াইআই যুক্ত হচ্ছে। বি (সেরা উত্তর):

d = defaultdict(int)

পাশাপাশি কাজ করে; কারণ হ'ল কলিং int()রিটার্ন 0যা defaultdictপর্দার পিছনে যা কাজ করে (অভিধান তৈরি করার সময়), তাই ডকুমেন্টেশনে নাম "কারখানা ফাংশন"।


2
আপনি যদি গণনার একটি অভিধান তৈরি করেন তবে আপনার কাউন্টার ব্যবহার করা উচিত (পাইথন ২.7 ধরে ধরে) um এবং আমি এর defaultdict(lambda: 0)পরিবর্তে ব্যবহার করেছি defaultdict(int)কারণ আমি মনে করি এটি কী স্পষ্ট হচ্ছে তা স্পষ্ট; আপনি 0যদি int()যুক্তি ছাড়াই কল করেন তবে পাঠককে আপনার জানা দরকার । YMMV।
ক্রিস বি

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()আমাদের জন্য সঠিক পদ্ধতি কিনা । আমাদের ডিক্ট রয়েছে 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

কীটি উপস্থিত থাকলে বা না থাকলে তথ্যটি পেতে আমরা এটি ব্যবহার করতে পারি। তবে যদি আমরা একটি একক দিয়ে ডিক তৈরি করি তবে এটি বিবেচনা করুন 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মান, যে couldbe যেখানে ইস্যু ব্যবস্থাপনার উদ্দেশ্যে ব্যবহৃত key:None। উদাহরণ: d.get("key", False)
অ্যালেক্স

.get()দ্রুততম উপায়। আর একটি বিকল্প হ'ল একটি try/ exceptব্লকে
HCLivess

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__ফাংশনটিকে অনুরোধ করে।
ব্যবহারকারী 1767754

@ ব্যবহারকারী 1767754 আমি ব্যবহার করছি foo = x['foo'] if x.__contains__('foo') else 'bar'। কোনও ধারণা কীভাবে inএই অভিব্যক্তির অংশ হিসাবে অপারেটরটি ব্যবহার করতে পারে ?
ডোনারডাডন

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। বুলিয়ান ক্রিয়াকলাপগুলি বাম থেকে ডানে মূল্যায়ন করা হয় এবং অপারেন্ডটি সত্য বা মিথ্যা নয় return

আসুন একটি উদাহরণ দেখুন:

>>> '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

কীটি বিদ্যমান থাকলে এটি ইতিমধ্যে সঠিক ফলাফলটি দেয়, তবে আমরা এটি 'বু' মুদ্রণ করতে চাই যখন এটি না থাকে। সুতরাং, আমরা ফলাফল এবং 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
সিস্টেম 123456

যদি লিনিয়ার সন্ধান করতে হয় তবে কেন একটি অভিধান ব্যবহার করছেন?
জাঁ ফ্রাসোয়া Fabre
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.