অভিধানে (অজগর) কোনও মান বিদ্যমান কিনা তা কীভাবে পরীক্ষা করবেন


251

পাইথনে আমার নিম্নলিখিত অভিধান রয়েছে:

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

এই অভিধানটিতে "এক" বা "দুটি" এর মতো কোনও মান বিদ্যমান কিনা তা খুঁজে পাওয়ার জন্য আমার একটি উপায় প্রয়োজন।

উদাহরণস্বরূপ, যদি আমি জানতে চাইতাম যে সূচি "1" বিদ্যমান আছে তবে আমাকে কেবল টাইপ করতে হবে:

"1" in d

এবং তখন পাইথন আমাকে বলত যে এটি সত্য বা মিথ্যা কিনা তবে মানটির অস্তিত্ব আছে কিনা তা খুঁজে বের করার জন্য আমাকে একই সঠিক জিনিসটি করা দরকার।

উত্তর:


381
>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True

কৌতূহলের বাইরে কিছু তুলনামূলক সময়:

>>> T(lambda : 'one' in d.itervalues()).repeat()
[0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
>>> T(lambda : 'one' in d.values()).repeat()
[0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
>>> T(lambda : 'one' in d.viewvalues()).repeat()
[0.32004380226135254, 0.31716084480285645, 0.3171098232269287]

সম্পাদনা: এবং যদি আপনি বিস্মিত হন তবে কেন ... কারণটি হ'ল উপরের প্রত্যেকে পৃথক ধরণের অবজেক্ট প্রদান করে যা অনুসন্ধানের জন্য উপযুক্ত বা নাও উপযুক্ত হতে পারে:

>>> type(d.viewvalues())
<type 'dict_values'>
>>> type(d.values())
<type 'list'>
>>> type(d.itervalues())
<type 'dictionary-valueiterator'>

সম্পাদনা 2: মন্তব্যে অনুরোধ অনুযায়ী ...

>>> T(lambda : 'four' in d.itervalues()).repeat()
[0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
>>> T(lambda : 'four' in d.values()).repeat()
[0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
>>> T(lambda : 'four' in d.viewvalues()).repeat()
[0.43414998054504395, 0.4213531017303467, 0.41684913635253906]

আমার হাতে অজগর নেই, আপনি কি 'এক' এর পরিবর্তে 'ফোর' দিয়ে পরীক্ষা চালাতে পারবেন?
সোল চেক

2
এটি সর্বোপরি প্রয়োজনীয় ছিল না, যদি না বড় ডিক না চালানো হয়। আমি অনুমান করি মানগুলিতে ওভারহেড মান তালিকাকে অনুলিপি করে এবং ভিউয়েলে () ভিউটি জীবিত বজায় রেখে তৈরি হয়।
সোল চেক

এর ছোট আকার দেওয়া d, সময় কার্যকরভাবে অর্থহীন। পাইথন 3 এ, dict.values()একটি অভিধানের দর্শন ডিফল্টরূপে হয় dict.itervalues()এবং dict.viewvalues()চলে যায়। আপনি এটির (আরও বৃহত্তর অভিধান সহ) পুনরায় পরীক্ষা list(d.values())করতে পারেন এবং পাইথন 2 আচরণ iter(d.values())পেতে এবং dict.itervalues()আচরণ পেতে ব্যবহার করতে পারেন তবে উভয় সংস্করণের জন্য একটি বিশ্বব্যাপী অনুসন্ধান এবং কল প্রয়োজন, সেগুলি একেবারে ধীর হয়ে যাবে। দুজনেই অতিরিক্ত কাজ করে যা দরকার নেই।
মার্টিজন পিটারস

33

তুমি ব্যবহার করতে পার

"one" in d.itervalues()

"one"আপনার অভিধানের মানগুলির মধ্যে রয়েছে কিনা তা পরীক্ষা করতে ।


23

পাইথন অভিধানে (কী) ফানসিওন রয়েছে

>>> d.get(key)

উদাহরণ স্বরূপ,

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
none

যদি আপনার কীটি উপস্থিত না থাকে তবে noneমান ফেরত দেবে ।

foo = d[key] # raise error if key doesn't exist
foo = d.get(key) # return none if key doesn't exist

সংস্করণ 3.0 এবং এর চেয়ে কম সংস্করণ সম্পর্কিত 5.0। ।


29
প্রশ্নের উত্তর দেয় না। ওপি key:valueকী হিসাবে নয় এবং মান হিসাবে জিজ্ঞাসা করেছিল ।
অক্ষয়নাগপাল

10

অভিধানের দর্শনগুলি ব্যবহার করুন:

if x in d.viewvalues():
    dosomething()..

4

মানগুলি পরীক্ষা করার জন্য বিভিন্ন ধরণের রয়েছে

d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False

মানগুলির তালিকা যদি হয়

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True

স্ট্রিং মান সহ মানগুলির তালিকাটি কী হয়

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True

আপনি অন্য কোনও কিছুর জন্য ব্যবহার করবেন না এমন তালিকা অবজেক্ট তৈরি করা এড়ানোর জন্য ব্যবহার করবেন না value in [... list comprehension over sequence ...], ব্যবহার করবেন না any(value in sequence ...), এবং মানটি সন্ধান করার পরে শর্ট সার্কিটের কাছে পড়ুন।
মার্টিজন পিটারস

0

পাইথন 3 এ আপনি values()অভিধানের ফাংশনটি ব্যবহার করতে পারেন । এটি মানগুলির একটি ভিউ অবজেক্ট প্রদান করে। এটি, ঘুরে, iterফাংশনে পাস করা যেতে পারে যা একটি পুনরাবৃত্তিকারী অবজেক্টকে প্রদান করে। পুনরুক্তিকারী এর inমতো ব্যবহার করে পরীক্ষা করা যায় ,

'one' in iter(d.values())

অথবা আপনি ভিউ অবজেক্টটি সরাসরি ব্যবহার করতে পারেন যেহেতু এটি তালিকার সাথে সমান

'one' in d.values()

1
নেই কোন বিন্দু ব্যবহার করে iter()একটি অভিধান দৃশ্য; inইতিমধ্যে অবজেক্ট হিসাবে বস্তুটি ব্যবহার করবে (ধরণটি কোনও উত্সর্গীকৃত __contains__পদ্ধতি প্রয়োগ করে না )। 'one' in iter(d.values())এবং এর মধ্যে একমাত্র পার্থক্য 'one in d.values()হ'ল আপনি পাইথনকে অতিরিক্ত কাজ করেছেন (এর জন্য বিশ্বব্যাপী অনুসন্ধানের জন্য মূল্য প্রদান করছেন iter)।
মার্টিজন পিটারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.