পাইথন অভিধান থেকে কী কী সরাবেন?


1760

অভিধান থেকে কোনও কী মুছে ফেলার সময়, আমি ব্যবহার করি:

if 'key' in my_dict:
    del my_dict['key']

এটি করার একটি লাইন উপায় আছে?


24
এই প্রশ্নের উত্তরে
zigg

উত্তর:


2830

অভিধানে তা নির্বিশেষে কোনও কী মুছে ফেলতে, এর দ্বি-যুক্তি ফর্মটি ব্যবহার করুন dict.pop():

my_dict.pop('key', None)

অভিধানে এবং অন্যথায় উপস্থিত my_dict[key]থাকলে এটি ফিরে আসবে । যদি দ্বিতীয় প্যারামিটারটি নির্দিষ্ট না করা হয় (যেমন। ) এবং উপস্থিত না থাকে তবে একটি উত্থাপিত হয়।keyNonemy_dict.pop('key')keyKeyError

যে কীটি বিদ্যমান রয়েছে তার গ্যারান্টিযুক্ত মুছে ফেলতে, আপনি এটিও ব্যবহার করতে পারেন

del my_dict['key']

KeyErrorকী অভিধানে না থাকলে এটি উত্থাপন করবে ।


152
কখনও কখনও pop()ওভার ব্যবহারের একটি সুবিধা del: এটি সেই কীটির জন্য মানটি দেয়। এইভাবে আপনি কোডের এক লাইনের একটি ডিক থেকে একটি এন্ট্রি পেতে এবং মুছতে পারেন।
kratenko

7
প্রশ্নে এটির মান রাখার দরকার নেই। এটি কেবল অপ্রয়োজনীয় জটিলতা যুক্ত করবে। @ Zigg (নীচে) থেকে উত্তরটি আরও ভাল।
সালভাতোর কোসেন্টিনো

10
পছন্দ করুন এই উত্তরের কোডটি কীভাবে অন্য উত্তরের কোডের চেয়ে জটিল?
সোভেন মারনাচ

33
সালভাতোরকোসেন্টিনো না, কোনও ফাংশনের রিটার্ন মান উপেক্ষা করা মোটেই অদক্ষ নয়। একেবারে বিপরীত - কীটি উপস্থিত না থাকলে এই দ্রবণটি try/ exceptদ্রবণের থেকে অনেক দ্রুত । আপনি এক বা অন্য পড়তে সহজ খুঁজে পেতে পারেন, যা ভাল। উভয়ই মূর্তিযুক্ত পাইথন, তাই আপনি যা পছন্দ করেন তা চয়ন করুন। তবে এই উত্তরটি আরও জটিল বা অদক্ষ দাবি করা সহজভাবে বোঝা যায় না।
সোভেন মারনাচ

5
@ user5359531 আমি বুঝতে পারছি না। এ কেমন সমস্যা? পাইথনের অন্তর্নির্মিত ধরণের পদ্ধতিগুলির কোনওটিই প্রত্যাবর্তন করে না self, সুতরাং এটি যদি এটি করে তবে এটি বিস্ময়কর হবে।
সোভেন মারনাচ

352

বিশেষত উত্তর দেওয়ার জন্য "এটি করার কোনও এক লাইনের উপায় আছে?"

if 'key' in my_dict: del my_dict['key']

... ভাল, আপনি জিজ্ঞাসা করেছেন ;-)

আপনি বিবেচনা করা উচিত, যদিও, যে একটি থেকে একটি বস্তু মুছে ফেলার এই পদ্ধতি dictহল পারমাণবিক না -এটা করে সম্ভব 'key'হতে পারে my_dictসময় ifবিবৃতি কিন্তু আগে মুছে ফেলা হতে পারে delমৃত্যুদন্ড কার্যকর করা হয়, যা মামলা delএকটি ব্যর্থ হয়ে যাবে KeyError। এটি দেওয়া, এটি ব্যবহার করাdict.pop বা এর লাইনের সাথে কিছু ব্যবহার করা সবচেয়ে নিরাপদ হবে

try:
    del my_dict['key']
except KeyError:
    pass

যা, অবশ্যই, তা হ 'ল না একটি এক মাছ ধরার নৌকা।


27
হ্যাঁ, popএটি অবশ্যই আরও সংক্ষিপ্ত, যদিও এটি এইভাবে করার একটি মূল সুবিধা রয়েছে: এটি অবিলম্বে পরিষ্কার হয়ে গেছে যে এটি কী করছে।
জিগজি

4
try/exceptবিবৃতি আরো ব্যয়বহুল। ব্যতিক্রম উত্থাপন ধীর।
ক্রিস বার্কার

16
@ ক্রিসবার্কার আমি খুঁজে পেয়েছি কীটি উপস্থিত থাকলে, tryসামান্য দ্রুত, যদিও তা না থাকলে, tryএটি আসলে একটি ভাল চুক্তি ধীর slow popমোটামুটি সামঞ্জস্যপূর্ণ তবে tryএকটি অ-উপস্থিত কী সহ সকলের চেয়ে ধীর । Gist.github.com/zigg/6280653 দেখুন । শেষ পর্যন্ত, এটি আপনি অভিধানে মূল কীটি প্রায়শই প্রত্যাশা করেন এবং আপনার অণুবিদ্যার দরকার আছে কি না - এবং আপনি অকাল অপ্টিমাইজেশনে
নিযুক্ত

9
আমি বিশ্বাস করি যে স্বচ্ছতার মানটি উপেক্ষা করা উচিত নয়। এই জন্য +1।
হুয়ান কার্লোস কটো

2
ব্যয়ের চেষ্টা ব্যতীত / বাদে, আপনিও যেতে পারেন if 'key' in mydict: #then del...। সঠিকভাবে পার্স করার জন্য আমার ডিকের কাছ থেকে একটি কী / ভাল বের করতে হবে, পপ একটি নিখুঁত সমাধান ছিল না।
মার্ক

152

ঠিক my_dict.pop("key", None)কী করছে তা বুঝতে আমার কিছুটা সময় লেগেছিল । সুতরাং আমি অন্যদের গুগলিংয়ের সময়টি বাঁচাতে একটি উত্তর হিসাবে এটি যুক্ত করব:

pop(key[, default])

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

নথিপত্র


15
পাইথন ইন্টারপ্রেটারে কেবল হেল্প (ডিক.পপ) টাইপ করুন।
ডেভিড মুলদার

13
যখন আপনার কিছু জানতে পারে তখন সহায়তা () এবং দির () আপনার বন্ধু হতে পারে।
ডেভিড মুলদার

3
বা dict.pop?আইপিথনে
এরিক কাপলুন

50

del my_dict[key]my_dict.pop(key)অভিধান উপস্থিত থেকে কীটি সরিয়ে ফেলার চেয়ে কিছুটা দ্রুত

>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"

>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786

কীটি উপস্থিত না থাকলে if key in my_dict: del my_dict[key]তার চেয়ে কিছুটা দ্রুত my_dict.pop(key, None)। উভয় delএকটি try/ exceptবিবৃতি চেয়ে কমপক্ষে তিনগুণ দ্রুত :

>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
...     del d['missing key']
... except KeyError:
...     pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133

1
এই জাতীয় দ্রুত অপারেশনের সময়গুলি পরিমাপ করা বেশ বোকা। আপনার কোডটি সম্ভবত খুব দ্রুত গতিতে যাচ্ছে না কারণ আপনি একটিতে পরিবর্তিত popহয়েছেন del। অভিধান তৈরি করা এটিকে থেকে মুছে ফেলা পুরোপুরি বামন করবে।
বরিস

1
@ বরিস - এটি একটি সাধারণ অনুশীলন হিসাবে কার্যকর।
ডেইজি

1
@ ডেইজি আমি যা বলছি তা হ'ল আপনার পক্ষে সর্বাধিক পঠনযোগ্য সিনট্যাক্স নির্বাচন করা উচিত যা অপারেশনটি 300 ন্যানোসেকেন্ড দ্রুত হয় না (এটি আক্ষরিক অর্থেই উপরের সময়ের প্রথম সেট থেকে delএবং এর মধ্যেই পার্থক্য pop)
বরিস

এছাড়াও এই অপারেশনগুলি এত দ্রুত যে এই সময়গুলি নির্ভরযোগ্য নয়।
বরিস

45

আপনার যদি কোডের এক লাইনের অভিধান থেকে অনেকগুলি কী সরিয়ে ফেলতে হয় তবে আমার মনে হয় মানচিত্র () ব্যবহার করা বেশ সংক্ষিপ্ত এবং পাইথোনিক পঠনযোগ্য:

myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}

এবং অভিধানে নেই এমন কোনও মান পপ করার ক্ষেত্রে যদি আপনার ত্রুটিগুলি ধরার দরকার হয় তবে ম্যাপের ভিতরে ল্যাম্বডা ব্যবহার করুন ():

map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

বা এর মধ্যে python3, আপনাকে অবশ্যই এর পরিবর্তে একটি তালিকা বোধগম্যতা ব্যবহার করতে হবে:

[myDict.pop(x, None) for x in ['a', 'c', 'e']]

এটা কাজ করে। এবং 'ই' এর ফলে ত্রুটি ঘটেনি, যদিও মাইডিক্টের একটি 'ই' কী নেই।


42
এটি পাইথন 3 এ কাজ করবে না কারণ mapএবং বন্ধুরা এখন অলস এবং ফিরে আয়রকারী। mapপার্শ্ব প্রতিক্রিয়া জন্য ব্যবহার করা সাধারণত দুর্বল অনুশীলন হিসাবে বিবেচিত হয়; একটি মান for ... inলুপ আরও ভাল হবে। দেখুন মতামত এবং Iterators পরিবর্তে তালিকাসমূহ আরও তথ্যের জন্য।
গ্রেগ ক্রিমার

5
স্বাদ এবং অনুশীলনের স্টাইল নির্বিশেষে, তালিকা উপলব্ধিগুলি এখনও পাই 3 তে কাজ করা উচিত [myDict.pop(i, None) for i in ['a', 'c']], কারণ তারা map(এবং filter) এর একটি সাধারণ বিকল্প প্রস্তাব করে ।
মাইকেল

@ মিশেলএকোকা আপনি তাদের পার্শ্ব প্রতিক্রিয়াগুলির জন্য তালিকার বোঝাগুলি ব্যবহার করবেন না, একটি নিয়মিত for ... inলুপ ব্যবহার করুন ।
বরিস

@ বরিস আপনি সম্ভবত সঠিক। আমার উত্তরটি বিশেষভাবে ব্যবহারের সাথে সম্পর্কিত map()যা প্রায়শই এর পার্শ্ব প্রতিক্রিয়াগুলির জন্য ব্যবহৃত হয়। পাইথনের প্রস্তাবিত বিকল্প হ'ল তালিকার বোধগম্যতা, যা আমার মতে এখনও বেশ পঠনযোগ্য এবং জ্ঞানীয়ভাবে ওয়ান-লাইনার হিসাবে হালকা (প্রশ্ন দেখুন)। কেবলমাত্র তাদের পার্শ্ব-প্রতিক্রিয়াগুলির জন্যই ব্যবহৃত হয়, উভয় কনস্ট্রাক্টসই প্রকৃতপক্ষে অকেজো তালিকার ফলস্বরূপ, যা অদক্ষ হতে পারে। পাইথন 3 হিসাবে, আমি কোনও বিল্ট-ইন ফাংশন সম্পর্কে অবগত নই যা ব্যয়বহুল উত্পাদনের ছাড়াই জেনারেটর এক্সপ্রেশন দিয়ে নিরাপদে এবং মার্জিতভাবে পুনরাবৃত্তি করতে পারে loop(d.pop(k) for k in ['a', 'b'])
মাইকেল একোকা

আমি আপ্লুত যে আমার সর্বকালের সর্বাধিক উত্সাহিত উত্তরে এমন কিছু হ্যাক অন্তর্ভুক্ত রয়েছে যা আমি কখনই ব্যবহার করব না। তালিকাটি উপলব্ধি (বিকল্প 3) আমার মতে সর্বনিম্ন খারাপ পদ্ধতির। এটি ব্যবহার করুন।
মার্ক ম্যাক্সমিস্টার

19

আপনি কীটি সরিয়ে দিয়ে নতুন অভিধান তৈরি করতে অভিধানের বোধগম্যতা ব্যবহার করতে পারেন :

>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}

আপনি শর্ত দ্বারা মুছে ফেলতে পারেন। keyনা থাকলে কোনও ত্রুটি নেই।



7

আমরা নিম্নলিখিত কয়েকটি পদ্ধতির মাধ্যমে পাইথন অভিধান থেকে একটি কী মুছতে পারি।

delকীওয়ার্ড ব্যবহার করে ; যদিও আপনার মত এটি প্রায় একই পদ্ধতির -

 myDict = {'one': 100, 'two': 200, 'three': 300 }
 print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
 if myDict.get('one') : del myDict['one']
 print(myDict)  # {'two': 200, 'three': 300}

অথবা

আমরা নিম্নলিখিতগুলির মতো করতে পারি:

তবে একটি মনে রাখা উচিত, এই প্রক্রিয়াটিতে এটি অভিধান থেকে বাদ দেওয়া নির্দিষ্ট কী তৈরির পরিবর্তে অভিধান থেকে কোনও কী মুছবে না । তদ্ব্যতীত, আমি লক্ষ্য করেছি যে এটি একটি অভিধান ফিরিয়েছে যা এর মতো আদেশ করা হয়নি ।myDict

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

যদি আমরা এটিকে শেলের মধ্যে চালাই, তবে {'five': 500, 'four': 400, 'three': 300, 'two': 200}এটি এর মতো কিছু কার্যকর করবে - লক্ষ্য করুন যে এটি আদেশের মতো নয় myDict। আবারও যদি আমরা মুদ্রণের চেষ্টা করি myDict, তবে আমরা এই পদ্ধতির মাধ্যমে অভিধান থেকে বাদ দিয়েছি এমন সমস্ত কী দেখতে পাব। তবে, নিম্নলিখিত বিবৃতিটি একটি ভেরিয়েবলের মধ্যে বরাদ্দ করে আমরা একটি নতুন অভিধান তৈরি করতে পারি:

var = {key:value for key, value in myDict.items() if key != 'one'}

এখন আমরা যদি এটি মুদ্রণের চেষ্টা করি, তবে এটি পিতামাতার আদেশটি অনুসরণ করবে:

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

অথবা

pop()পদ্ধতিটি ব্যবহার করে ।

myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

delএবং এর মধ্যে পার্থক্যটি popহল, pop()পদ্ধতিটি ব্যবহার করে , আমরা নীচের মতো, প্রয়োজন হলে মূল কীটির মানটি সংরক্ষণ করতে পারি :

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100

ভবিষ্যতের রেফারেন্সের জন্য এই सारটিটি কাঁটাচামচ করুন , যদি আপনি এটি দরকারী মনে করেন।


1
if myDict.get('one')কী উপস্থিত আছে কিনা তা পরীক্ষা করতে ব্যবহার করবেন না ! এটি ব্যর্থ হয় যদি মাইডিক্ট ['এক'] এর একটি মিথ্যা মান থাকে। এছাড়াও, ডিক্টসের অন্তর্নিহিত ক্রম নেই, সুতরাং এটি উল্লেখ করা কোনও অর্থবোধ করে না।
রব

@ রব ডিক্টস সিপিথন 3.6 দিয়ে শুরু করে সন্নিবেশ আদেশের মাধ্যমে এবং 3.7 দিয়ে শুরু হওয়া অন্যান্য পাইথন বাস্তবায়ন দ্বারা আদেশ করা হয়।
বরিস

4

আপনি খুব ভার্বোস হতে চাইলে আপনি ব্যতিক্রম হ্যান্ডলিং ব্যবহার করতে পারেন:

try: 
    del dict[key]

except KeyError: pass

এটি pop()পদ্ধতিটির চেয়ে ধীরে ধীরে, কীটি উপস্থিত না থাকলে।

my_dict.pop('key', None)

কয়েকটি কীগুলির জন্য এটি বিবেচিত হবে না, তবে আপনি যদি বার বার এটি করে থাকেন তবে পরবর্তী পদ্ধতিটি আরও ভাল বাজি।

দ্রুততম পন্থাটি হ'ল:

if 'key' in dict: 
    del myDict['key']

তবে এই পদ্ধতিটি বিপজ্জনক কারণ যদি 'key'দুটি লাইনের মধ্যে সরিয়ে ফেলা হয় তবে একটি KeyErrorউত্থাপিত হবে।


1

আমি অপরিবর্তনীয় সংস্করণ পছন্দ

foo = {
    1:1,
    2:2,
    3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
    return {
        k:v
        for k,v in dct.items() if k not in keyIter
    }

>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}

1

আর একটি উপায় হ'ল আইটেমগুলি ব্যবহার করে () + ডিক্স বোধগম্যতা

আইটেম () ডিক বোঝার সাথে মিলিয়ে কী-মূল্য জোড়া মুছে ফেলার কাজটি অর্জন করতে আমাদের সহায়তা করতে পারে তবে এটি একটি ইনপ্লেস ডিক কৌশল না হওয়ার একটি অপূর্ণতা রয়েছে। প্রকৃতপক্ষে একটি নতুন ডিক তৈরি করা থাকলে কীটি আমরা অন্তর্ভুক্ত করতে চাই না except

test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21} 

# Printing dictionary before removal 
print ("dictionary before performing remove is : " + str(test_dict)) 

# Using items() + dict comprehension to remove a dict. pair 
# removes  vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'} 

# Printing dictionary after removal 
print ("dictionary after remove is : " + str(new_dict)) 

আউটপুট:

dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}

0

কীতে একক ফিল্টার

  • "কী" ফেরত দিন এবং আমার_ডিক্টে "কী" উপস্থিত থাকলে এটি আমার_ডিক্ট থেকে সরান
  • আমার_ডিক্টে "কী" উপস্থিত না থাকলে কোনও কিছুই ফেরত পাবেন না

এটি my_dictজায়গায় পরিবর্তিত হবে (পরিবর্তনীয়)

my_dict.pop('key', None)

কীগুলিতে একাধিক ফিল্টার

একটি নতুন ডিক জেনারেট (অপরিবর্তনীয়)

dic1 = {
    "x":1,
    "y": 2,
    "z": 3
}

def func1(item):
    return  item[0]!= "x" and item[0] != "y"

print(
    dict(
        filter(
            lambda item: item[0] != "x" and item[0] != "y", 
            dic1.items()
            )
    )
)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.