অভিধান কী উপলব্ধ না থাকলে কিছুই ফিরিয়ে আনবেন না


488

অভিধানের মানটি পাওয়া গেলে আমার কাছে একটি উপায় প্রয়োজন, বা Noneযদি তা না থেকে কেবল ফিরে আসে।

যাইহোক, পাইথন একটি KeyErrorব্যতিক্রম উত্থাপন করে যদি আপনি একটি কী ব্যবহার করেন যা অস্তিত্বহীন। আমি জানি যে আমি কীটি পরীক্ষা করতে পারি তবে আমি আরও স্পষ্টত কিছু খুঁজছি। Noneকীটি উপস্থিত না থাকলে কেবল ফিরে আসার উপায় আছে কি ?


74
কেবল এর .get(key)পরিবর্তে ব্যবহার করুন[key]
গ্যাবে

12
একটি ডিক একটি কীআরর ব্যতিক্রম উত্থাপন করে। এটি "কী_আরটার রিটার্ন" করে না।
বের मे

3
কীটি অ্যাক্সেস করা এবং ব্যতিক্রম ধরা পাইথনে একেবারে ঠিক। এটি এমনকি একটি সুপরিচিত এবং বহুল ব্যবহৃত ডিজাইনের ধরণ। আপনি যদি এর পরিবর্তে কোনওটিই ফেরত না দেন তবে কোনওটিই মান হিসাবে সংরক্ষণ করা অসম্ভব হয়ে পড়ে, যা কিছু ক্ষেত্রে প্রাসঙ্গিক হতে পারে।
বের मे

1
কখনও কখনও আপনি অভিধানে "কিছুই নয়" এন্ট্রিগুলির সাথে চিকিত্সা করতে চান এবং এন্ট্রিগুলি অনুপস্থিত থাকে, সেক্ষেত্রে স্বীকৃত উত্তরটি কাজটি ঠিকঠাক করে বলে মনে হয়।
সিবি

@ বার আমি স্পষ্ট করার জন্য প্রশ্নটি সম্পাদনা করেছি। আপনিও তাই করতে পারতেন।
törzsmókus

উত্তর:


811

তুমি ব্যবহার করতে পার dict.get()

value = d.get(key)

যা ফিরে আসবে Noneযদি key is not in d। আপনি আলাদা আলাদা ডিফল্ট মান প্রদান করতে পারেন যা এর পরিবর্তে ফিরে আসবে None:

value = d.get(key, "empty")

47
মনে রাখবেন যে ডিফল্টটিতে Noneকীটি স্পষ্টভাবে ম্যাপ করা থাকলে ডিফল্ট ফ্যালব্যাকের সাথে দ্বিতীয় রূপটি এখনও ফিরে আসবে None। যদি আপনি যা চান তা না হয় তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন d.get(key) or "empty"
সিবি

15
@cib: গুড পয়েন্ট, কিন্তু সমাধান একই সমস্যা আছে - যদি কী কোন "falsy" মান ম্যাপ করা হয় (যেমন [], "", False, 0.0বা প্রকৃতপক্ষে None), তারপর আপনার সমাধান সবসময় ফিরে আসবে 0। যদি আপনি Noneমান হিসাবে প্রত্যাশা করেন তবে আপনাকে if key in d:চেকটি স্পষ্টভাবে করতে হবে ।
টিম পিটজ্যাকার

1
@ আইসিবি এর জন্য উত্সাহিত, আমি এখানে যা ভুল করছি তা নিয়ে কাজ করতে পারি না।
wobbily_col

@ টিমপিটজ্যাকার - আপনি কি আপনার উত্তরটি ব্যাখ্যা করতে পারেন? d.get (key) বা "খালি" কে কোনও 'মিথ্যা' মানগুলিতে ম্যাপ করার ক্ষেত্রে "ভুল" না হলে যদি আমার ভুল না হয় empty
মিলোমিন্ডারবাইন্ডার

@ মিলোমিন্ডারবাইন্ডার: "empty"যদি keyবৈধ কী না হয় তবে ফিরে আসবে d। মানটি keyম্যাপ করা হয় এর সাথে এর কোনও সম্পর্ক নেই ।
টিম পিটজেকার

63

আর ভাবছি না। এটি ভাষায় নির্মিত।

    >>> সহায়তা (ডিক্ট)

    মডিউল বিল্টিনগুলিতে শ্রেণি ডিকের সহায়তা:

    শ্রেণি আদেশ (বস্তু)
     | ডিক () -> নতুন খালি অভিধান
     | ডিক (ম্যাপিং) -> নতুন অভিধানটি ম্যাপিং অবজেক্টের থেকে আরম্ভ করা
     | (কী, মান) জোড়া
    ...
     |  
     | পাওয়া(...)
     | ডিজেট (কে [, ডি]) -> ডি [কে] ডি তে কে, অন্যথায় ডি। ডিফল্ট কারও কাছে নয়।
     |  
    ...

22

ব্যবহার dict.get

অভিধানে যদি কী থাকে তবে কীটির মান প্রদান করে, অন্যথায় ডিফল্ট। যদি ডিফল্টটি দেওয়া না হয় তবে এটি ডিফল্ট নয় কারও সাথে, যাতে এই পদ্ধতিটি কখনই কী-ইরার উত্থাপন করে না।


19

get()আপনার dictক্লাস থেকে পদ্ধতিটি ব্যবহার করা উচিত

d = {}
r = d.get('missing_key', None)

এর ফলে হবে r == None। অভিধানে যদি কীটি পাওয়া যায় না, তবে গেম ফাংশনটি দ্বিতীয় যুক্তি দেখায়।


19
আপনি Noneস্পষ্টভাবে পাস করতে হবে না। এটি ডিফল্ট।
বিজার্ন পোলেক্স

18

আপনি যদি আরও স্বচ্ছ সমাধান চান তবে আপনি dictএই আচরণটি পেতে সাবক্লাস করতে পারেন :

class NoneDict(dict):
    def __getitem__(self, key):
        return dict.get(self, key)

>>> foo = NoneDict([(1,"asdf"), (2,"qwerty")])
>>> foo[1]
'asdf'
>>> foo[2]
'qwerty'
>>> foo[3] is None
True

2
@ মেরিনেউ: যেমন আমি অন্য উত্তরে একটি মন্তব্যে উল্লেখ করেছি, এর সাথে সমস্যা defaultdictহ'ল এটি প্রতিবার বৃদ্ধি পাবে যে কোনও উপাদান এখনও অনুরোধ করা হয়নি। এটি সর্বদা কাম্য নয়।
বিজার্ন পোল্লেক্স 21

@ জর্জানপ্লেক্স এটি এখন পর্যন্ত মার্জিত, কোনও গভীরতা সমর্থন করার জন্য এটি কীভাবে প্রসারিত করা যায় সে সম্পর্কে কোনও সূত্র? আমি উপার্জন মানে foo['bar']['test']['sss']ফিরতে Noneব্যতিক্রম পরিবর্তে এক গভীরতা পরে দান শুরু TypeErrorপরিবর্তেKeyError
nehem

@itsneo। আপনি পুরো কাঠামো তৈরি করতে পারে NoneDicts। এটি KeyErrorআন্তঃতম বস্তুতে ঘটতে সাহায্য করবে। অন্যথায় সমস্যাটি হ'ল, একবার আপনি কোনও Noneজিনিস ফেরত দেওয়ার পরে আপনি এটি আর সাবস্ক্রাইব করতে পারবেন না। একটি কুরুচিপূর্ণ হ্যাক অন্য পরীক্ষার মত পরীক্ষা করে যা ফিরে আসবে None। এটি সতর্কতা অবলম্বন করুন যে এটি ভয়াবহ বাগগুলি হতে পারে।
ম্যাগু_

@ BjörnPollex- এ পরিবর্তন return dict.get(self, key)করা কি ঠিক আছে return super().get(key)? তারপরে আমি যদি আদেশের পরিবর্তে অর্ডারডিক্ট ব্যবহার করার সিদ্ধান্ত নিই, উদাহরণস্বরূপ, কোডের একাধিক লাইন পরিবর্তন করার বিষয়ে আমাকে চিন্তা করতে হবে না।
কাঠ

@ উড হ্যাঁ, এটি আসলে অনেক ভাল লাগবে!
Björn Pollex

12

আমি সাধারণত এরকম পরিস্থিতিতে ডিফল্টডিক্ট্ট ব্যবহার করি । আপনি একটি কারখানা পদ্ধতি সরবরাহ করেন যা কোনও আর্গুমেন্ট নেয় না এবং একটি নতুন কী দেখলে একটি মান তৈরি করে। আপনি নতুন কীগুলিতে খালি তালিকার মতো কিছু ফিরিয়ে দিতে চাইলে এটি আরও কার্যকর হয় ( উদাহরণগুলি দেখুন )।

from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key']  # prints 'None'

19
সমস্যাটি defaultdictহ'ল প্রতিবার অ-বিদ্যমান উপাদানটিকে অনুরোধ করার সময় এটি বাড়তে থাকবে।
বিজরন পোল্লেক্স 21

8

অন্যরা ইতিমধ্যে পরামর্শ হিসাবে আপনি কোনও dictসামগ্রীর get()পদ্ধতি ব্যবহার করতে পারেন । বিকল্পভাবে, আপনি যা করছেন ঠিক তার উপর নির্ভর করে আপনি try/exceptএই জাতীয় স্যুটটি ব্যবহার করতে পারবেন :

try:
   <to do something with d[key]>
except KeyError:
   <deal with it not being there>

কেসটি পরিচালনা করার জন্য এটি একটি "পাইথোনিক" পদ্ধতির হিসাবে বিবেচিত।


7

একটি ওয়ান লাইন সমাধান হ'ল:

item['key'] if 'key' in item else None

নতুন তালিকায় অভিধানের মান যুক্ত করার চেষ্টা করার সময় এবং এটি একটি ডিফল্ট সরবরাহ করতে চাইলে এটি কার্যকর হয়:

যেমন।

row = [item['key'] if 'key' in item else 'default_value']

5

অন্যরা যেমন উপরে বলেছে, আপনি get () ব্যবহার করতে পারেন।

তবে কীটি পরীক্ষা করতে, আপনি এটিও করতে পারেন:

d = {}
if 'keyname' in d:

    # d['keyname'] exists
    pass

else:

    # d['keyname'] does not exist
    pass

আমি এখন দেখছি যে আপনি এটি করতে ইতিমধ্যে জানেন। আমি আমার পোস্টটি মুছতে চলেছিলাম, তবে আমি অন্যের জন্য এটি রেফারেন্সের জন্য রেখে দেব।
মারেক পি 22

4
এই পদ্ধতির জন্য সাধারণত সেখানে উপস্থিত হওয়ার সময় দু'বার সন্ধানের প্রয়োজন হয় যা সম্ভবত getপদ্ধতির কারণ ।
মার্টিনিউ

0

পাইথন 2 বনাম পাইথন 3 এ যা কিছু সম্ভব হয়েছিল তা দ্বারা আমি হতাশ হয়ে পড়েছিলাম। পাইথন 3 এর জন্য আমি কী শেষ করেছি তার ভিত্তিতে আমি এর উত্তর দেব। আমার উদ্দেশ্যটি সহজ ছিল: অভিধান বিন্যাসে কোনও জসন প্রতিক্রিয়া কোনও ত্রুটি দিয়েছে কিনা তা পরীক্ষা করে দেখুন। আমার অভিধানটিকে "টোকেন" বলা হয় এবং আমার কীটি আমি খুঁজছি সেটি হল "ত্রুটি"। আমি কী "ত্রুটি" কী খুঁজছি এবং যদি এটি কোনওটির মান নির্ধারণ না করানো হয় তবে চেক করা মানটি কোনওটি নয়, যদি আমার কোডটি দিয়ে এগিয়ে যান। যদি আমার কাছে কী "ত্রুটি" থাকে তবে অন্য একটি বিবৃতি হ্যান্ডেল করবে।

if ((token.get('error', None)) is None):
    do something

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