অভিধান থেকে একটি উপাদান মুছুন


1390

পাইথনের অভিধান থেকে কোনও আইটেম মুছার উপায় আছে কি?

অতিরিক্তভাবে, আমি একটি অনুলিপি (অর্থাত্ মূলটি সংশোধন না করে) ফেরানোর জন্য অভিধান থেকে কোনও আইটেম কীভাবে মুছতে পারি?


13
আপনি যখন ডিকশনারিটি ফিরিয়ে আনতে চান তখন আপনি কেন একটি ফাংশন প্রয়োজন?
এমিলারহোডস

5
অভিধান popপদ্ধতি অভিধান পরিবর্তন ইন-জায়গা । সুতরাং এটি ডিকশনারির রেফারেন্সটিকে পরিবর্তিত করে যা কলার থেকে "সহায়তাকারী ফাংশন" এ প্রেরণ করা হয়েছিল। সুতরাং "সহায়তাকারী ফাংশন" তে কোনও কিছুই ফেরত দেওয়ার দরকার নেই, যেহেতু কলারের অভিধানের মূল উল্লেখটি ইতিমধ্যে পরিবর্তিত হবে। dict.pop()আপনার প্রয়োজন না হলে কোনও কিছুর কাছে রিটার্ন বরাদ্দ করবেন না । উদাহরণ: do stuff with my_dict; my_dict.pop(my_key, None); do more stuff with my_dict # now doesn't have my_keydeepcopy(my_dict)প্রয়োজনে ব্যবহার করুন ।
মার্ক মিকোফস্কি

1
যেহেতু মূল শিরোনাম বিবরণগুলির সাথে দ্বিমত পোষণ করেছে এবং স্পষ্টত সমাধানটি সুনির্দিষ্টভাবে বাদ দিয়েছে d.pop(), তাই বিশদে বর্ণিত প্রশ্ন জিজ্ঞাসার জন্য আমি শিরোনামটি স্থির করেছিলাম।
smci

1
আপনি যদি সত্যিই এটি করতে চান কিনা তা জিজ্ঞাসা করে আমাদের একটি সতর্কতা যুক্ত করা উচিত , যেমন আপনি E উপাদানগুলির সাথে একটি অভিধানে এন বার করেন তবে আপনি সমস্ত গভীর অনুলিপি সহ (/ ব্যবহার) ও (এন * ই) মেমরি ফাঁস করবেন। আপনি যদি কেবল পঠনযোগ্য (অগভীর অনুলিপি) চান, তবে করুন d.pop(key)। তবে যদি কোনও কিছু অগভীর অনুলিপি পরিবর্তন করে তবে আপনার এলিয়াসিংয়ের সাথে একটি সুপরিচিত সমস্যা রয়েছে । আপনি যদি আমাদের আরও বৃহত্তর প্রসঙ্গটি জানান তবে এটি সহায়তা করে। (ডিকের মানগুলি অন্য কোনও কি কখনও সংশোধন করছে? আপনি কি কোনও তালিকাটিকে ধ্বংসাত্মকভাবে পুনরাবৃত্তি করার চেষ্টা করছেন? যদি না হয় তবে কি?)
স্মৃতি

5
"আপনি কেবল অভিধানটি সংশোধন করতে পারলে এমন কোনও ফাংশন কেন দরকার যা একটি অভিধান ফেরত দেয়?" আপনি খাঁটি ফাংশন লিখতে চান বলে সম্ভবত তাদের পরামিতিগুলি সংশোধন করে না ?
জিন কলাহান

উত্তর:


1724

delবিবৃতি একটি উপাদান সরিয়ে ফেলা হবে:

del d[key]

যাইহোক, এটি বিদ্যমান অভিধানকে রূপান্তর করে তাই অভিধানের বিষয়বস্তু অন্য কারও জন্য পরিবর্তিত হয় যার একই দৃষ্টান্তের রেফারেন্স রয়েছে। একটি নতুন অভিধান ফিরে আসতে অভিধানের একটি অনুলিপি তৈরি করুন:

def removekey(d, key):
    r = dict(d)
    del r[key]
    return r

dict()কন্সট্রাকটর একটি তোলে অগভীর কপি । একটি গভীর অনুলিপি তৈরি করতে, copyমডিউলটি দেখুন


মনে রাখবেন যে প্রতিটি ডিক del/ অ্যাসাইনমেন্ট / ইত্যাদির জন্য একটি অনুলিপি তৈরি করা । মানে আপনি ধ্রুবক সময় থেকে রৈখিক সময়ে যাচ্ছেন এবং লিনিয়ার স্পেস ব্যবহার করছেন। ছোট dicts জন্য, এটি কোন সমস্যা নয়। তবে আপনি যদি বড় ডিক্টের প্রচুর অনুলিপি তৈরির পরিকল্পনা করছেন তবে আপনি সম্ভবত একটি হ্যাম্টের মতো একটি আলাদা ডেটা কাঠামো চান ( এই উত্তরটিতে বর্ণিত )।


15
অভিধানগুলি +1 এর পরিবর্তনের বিষয়ে একটি দুর্দান্ত বক্তব্য - যদিও আমি এমন একটি সময় ভাবতে পারি না যখন আমি অভিধানের অনুলিপি চেয়েছিলাম, আমি সর্বদা 'এরিওনস' অনুলিপিটি একই হয়ে থাকি। দুর্দান্ত পয়েন্ট
tMC

30
@ টিএমসি যদি আপনি dictএটির লুপিং সম্পাদনা করেন তবে এটি আপনাকে একটি ত্রুটি দেবে:RuntimeError: dictionary changed size during iteration
ভার্টিগোরে

15
popপদ্ধতি সম্পর্কে যা আসলে একই কাজ করে? এটি কি অজগর নয়? (ডিকের পদ্ধতি হচ্ছে, বিশেষ সংরক্ষিত শব্দ নয়)?
সার্জ

21
এই উত্তরের একটি দুর্বলতা রয়েছে, এটি বিভ্রান্তিকর হতে পারে। পাঠকরা ভুল বুঝতে পারে যে ডিক (ডি) তাদের 'ডি' দিয়ে একটি অনুলিপি দিতে পারে। তবে এটি একটি অসম্পূর্ণ অনুলিপি। যখন কেবল ডেল কী অপারেশন করবেন, ঠিক আছে। কিন্তু আপনি যখন নেস্টেড ডিকের সাথে অন্য কিছু করতে চান, তখন সেই অনুলিপি পদ্ধতিটি ব্যবহার করে 'আর' সংশোধন করা মূল 'ডি' তে পরিবর্তিত হতে পারে। একটি খাঁটি অনুলিপি পেতে আপনার প্রথমে 'আমদানি অনুলিপি', এবং তারপরে 'আর = কপি.দীপকপি (ডি)' দরকার।
জেন

10
@ জেন: যথেষ্ট ন্যায্য, আমি অগভীর বনাম গভীর কপি সম্পর্কে একটি নোট যুক্ত করেছি।
গ্রেগ হিউগিল

264

pop অভিধানকে পরিবর্তন করে।

 >>> lol = {"hello": "gdbye"}
 >>> lol.pop("hello")
     'gdbye'
 >>> lol
     {}

আপনি যদি মূলটি রাখতে চান তবে আপনি কেবল এটি অনুলিপি করতে পারেন।


29
"দেল" ঠিক আছে, তবে "পপ" বেশি মনে হচ্ছে "পাইথোনিক", আমার মতে।
ivanleoncz

1
@ivanleoncz কেন?
কেভর

3
pop'পপড' ছিল এমন মানটি ফিরিয়ে দেয়, যা আপনাকে পরবর্তী কোনও কারণে এই মানটি ব্যবহার করতে দেয়। যদি এটি "পাইথোনিক" বেশি না হয় তবে আমি বলব যে এটি অবশ্যই আরও ভাল বলে মনে হচ্ছে :) :) এটি কোনও ডিক নয়, তবে এটি উভয়ের জন্য একইভাবে কাজ করে: github.com/ivanlmj/python- প্রোটোটাইপস
ব্লব

2
@ivanleoncz আরও একটি কারণে এটি আরও ভাল, popএকটি ডিফল্ট মান প্রদান করা যেতে পারে যা ডিক থেকে কোনও কী অনুপস্থিত থাকলে ফিরে আসবে। আপনার যখন কয়েকটি কী সরিয়ে ফেলতে হবে তখন এটি বেশ ভাল তবে এর মধ্যে কিছুগুলি নিখোঁজ হতে পারে; এই ক্ষেত্রে delনিক্ষেপ করা হবে KeyError
ইটাচি

80

আমি মনে করি আপনার সমাধানটি এটি করার সর্বোত্তম উপায়। তবে আপনি যদি অন্য কোনও সমাধান চান, আপনি নিজের নির্দিষ্ট কীটি না রেখে পুরানো অভিধান থেকে কীগুলি ব্যবহার করে একটি নতুন অভিধান তৈরি করতে পারেন:

>>> a
{0: 'zero', 1: 'one', 2: 'two', 3: 'three'}
>>> {i:a[i] for i in a if i!=0}
{1: 'one', 2: 'two', 3: 'three'}

2
সত্যিই ঠাণ্ডা. আমি একটি নতুন ফাংশন সংজ্ঞায়িত না করেই একটি অভিধান ফিল্টার করার দ্রুত পদ্ধতিটি পছন্দ করি।
জো জে

6
যাঁরা বোধগম্যতার সাথে পরিচিত নন, তাঁদের জন্যও আপনি এই জাতীয় কিছু করতে পারেন: {i:a[i] for i in a if i not in [0, 1, 2]}আপনি যদি বেশ কয়েকটি উপাদান মুছতে চান।
কামথেনি

9
{k:v for k,v in a.items() if k != 0}আমার মনে হয় ভাল হবে ।
rlbond

1
কী দ্বারা কোনও আইটেম সরানো এবং একই লাইনে নতুন ডিকের ফলাফল ফিরিয়ে দেওয়ার জন্য সেরা সমাধান। উদাহরণস্বরূপ, যদি আপনার কোনও একক আইটেম ছাড়াই ইতিমধ্যে নির্মিত ডিক ব্যবহার করা প্রয়োজন **kwargs,some_function(**{k:v for k,v in some_dict.items() if k not 'some_key'})
কোল

এখানে সেরা সমাধান। একটি লাইনার এবং এটি মূল অভিধানটিকে রূপান্তরিত করে না।
অ্যান্ড্রু শীতকালীন

55

দেল বিবৃতি আপনি যা খুঁজছেন তা নয়। যদি আপনার কাছে 'বার' নামক কী দিয়ে ফু নামে একটি অভিধান থাকে তবে আপনি ফু থেকে এভাবে 'বার' মুছতে পারেন:

del foo['bar']

নোট করুন যে এটি অভিধানে চালিত স্থায়ীভাবে পরিবর্তন করে। আপনি যদি মূল অভিধানটি রাখতে চান তবে আপনাকে আগেই একটি অনুলিপি তৈরি করতে হবে:

>>> foo = {'bar': 'baz'}
>>> fu = dict(foo)
>>> del foo['bar']
>>> print foo
{}
>>> print fu
{'bar': 'baz'}

dictকল অগভীর কপি করে তোলে। আপনি যদি একটি গভীর অনুলিপি চান, ব্যবহার করুন copy.deepcopy

আপনার সুবিধার জন্য আপনি এখানে অনুলিপি এবং পেস্ট করতে পারেন এমন একটি পদ্ধতি:

def minus_key(key, dictionary):
    shallow_copy = dict(dictionary)
    del shallow_copy[key]
    return shallow_copy

1
@ pythonian29033, আসলে, কোন । গৃহীত উত্তর প্রত্যাশিত হিসাবে কাজ করে - এটি কোনও কী ছাড়াই ডিকটি প্রদান করে। এই উত্তর থেকে পদ্ধতির মূল
ডিককে পরিবর্তিত করে

1
@ আরসেল ৮৪৮, >>>অজগর-উদাহরণগুলিতে প্রায়শই কেন ব্যবহৃত হয়? হ্যাঁ, পাইথন-ডকে এই জাতীয় প্রচুর পরিমাণ রয়েছে। তবে এই জাতীয় কোডটি কপিপাস্টের জন্য সুবিধাজনক নয় । আমি বিভ্রান্ত ...
ম্যাক্সকরিউকভ

@ ম্যাক্সকরিউকোভ হ্যাঁ! তবে সেই ফাংশনটি এবং এই উত্তরটি হুবহু একই রকম answer উত্তরটি কোনও ফাংশনের ভিতরে থাকা ব্যতীত। এবং আপনি >>>
অজগরকে

2
@ পাইথোনিয়ান 29033 সম্পর্কে >>>। হ্যাঁ, এটি REPL- শৈলী, তবে আসুন খোলামেলা কথা বলি: কেবলমাত্র একজন ব্যক্তি এই নমুনাটি লিখেছিলেন এবং 1000 এটি পড়েছেন। আমি মনে করি, সহজ অনুলিপি এবং চালনার অনুমতি দেওয়ার জন্য উদাহরণগুলি লিখতে ভাল লাগবে। আমি হাত দিয়ে এই কোণ বন্ধনীগুলি সরাতে পছন্দ করি না। অথবা লাইন দ্বারা লাইন অনুলিপি করুন .. সুতরাং আমি বুঝতে পারি না: কেন এই কোণগুলি এখনও রয়েছে))) আমি কি কিছু জানি না?
ম্যাক্সকুরিউকভ

3
আপনার সুবিধার জন্য আমি একটি ফাংশন যুক্ত করেছি যা অনুলিপি / আটকানো যায়।
আরসেল৪৮

48

অনেক সুন্দর উত্তর আছে, তবে আমি একটি বিষয়ে জোর দিতে চাই।

অভিধান থেকে আইটেমগুলি সরাতে আপনি দুটি dict.pop()পদ্ধতি এবং আরও জেনেরিক delবিবৃতি ব্যবহার করতে পারেন । তারা উভয়ই মূল অভিধানটি পরিবর্তন করে, তাই আপনাকে একটি অনুলিপি তৈরি করতে হবে (নীচে বিশদটি দেখুন)।

KeyErrorআপনি তাদের যে কীটি সরবরাহ করছেন তা অভিধানে উপস্থিত না থাকলে উভয়ই এই উত্থাপন করবে :

key_to_remove = "c"
d = {"a": 1, "b": 2}
del d[key_to_remove]  # Raises `KeyError: 'c'`

এবং

key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove)  # Raises `KeyError: 'c'`

আপনার এটি যত্ন নিতে হবে:

ব্যতিক্রম ক্যাপচার দ্বারা:

key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
    del d[key_to_remove]
except KeyError as ex:
    print("No such key: '%s'" % ex.message)

এবং

key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
    d.pop(key_to_remove)
except KeyError as ex:
    print("No such key: '%s'" % ex.message)

একটি পরীক্ষা করে:

key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
    del d[key_to_remove]

এবং

key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
    d.pop(key_to_remove)

তবে এর সাথে pop()আরও অনেক সংক্ষিপ্ত উপায় রয়েছে - ডিফল্ট রিটার্ন মান সরবরাহ করুন:

key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove, None)  # No `KeyError` here

আপনি যদি pop()কোনও কীটি সরিয়ে ফেলার মান পেতে ব্যবহার না করেন তবে আপনি কিছু সরবরাহ করতে পারেন, প্রয়োজনীয় নয় None। যদিও এটি হতে পারে যে চেক delদিয়ে ব্যবহার করা তার নিজস্ব জটিলতাগুলির সাথে একটি ক্রিয়াকলাপ হওয়ার কারণে ওভারহেডের কারণে সামান্য দ্রুত হয় । সাধারণত এটি ক্ষেত্রে হয় না, তাই ডিফল্ট মান সহ যথেষ্ট ভাল।inpop()pop()


মূল প্রশ্নটি হিসাবে, আপনাকে মূল অভিধানটি সংরক্ষণ করতে আপনার অভিধানের একটি অনুলিপি তৈরি করতে হবে এবং কীটি অপসারণ না করে একটি নতুন আছে।

অন্য কিছু লোক এখানে একটি সম্পূর্ণ (গভীর) অনুলিপি তৈরি করার পরামর্শ দিয়েছেন copy.deepcopy(), যা ওভারকিল হতে পারে, একটি "সাধারণ" (অগভীর) অনুলিপি ব্যবহার করে copy.copy()বা dict.copy()যথেষ্ট হতে পারে। অভিধানটি কীটির মান হিসাবে বস্তুর রেফারেন্স রাখে। সুতরাং আপনি যখন কোনও অভিধান থেকে একটি কী সরিয়ে ফেলেন তখন এই রেফারেন্সটি সরিয়ে ফেলা হয়, অবজেক্টটি রেফারেন্স করা হয় না। মেমরিটিতে এর জন্য অন্য কোনও রেফারেন্স না থাকলে অবজেক্টটি নিজেই পরে আবর্জনা সংগ্রহকারী দ্বারা স্বয়ংক্রিয়ভাবে মুছে ফেলা হতে পারে। অগভীর অনুলিপিটির তুলনায় একটি গভীর অনুলিপি তৈরির জন্য আরও বেশি গণনা প্রয়োজন, সুতরাং এটি অনুলিপি তৈরি করে, মেমরি নষ্ট করে এবং জিসিকে আরও কাজ সরবরাহ করে কোডের কার্যকারিতা হ্রাস করে, কখনও কখনও অগভীর অনুলিপি যথেষ্ট is

তবে, যদি আপনার অভিধানের মান হিসাবে পরিবর্তনীয় অবজেক্ট থাকে এবং কী ছাড়াই প্রত্যাবর্তিত অভিধানে পরে এগুলি সংশোধন করার পরিকল্পনা করেন, আপনাকে একটি গভীর অনুলিপি তৈরি করতে হবে।

অগভীর অনুলিপি সহ:

def get_dict_wo_key(dictionary, key):
    """Returns a **shallow** copy of the dictionary without a key."""
    _dict = dictionary.copy()
    _dict.pop(key, None)
    return _dict


d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"

new_d = get_dict_wo_key(d, key_to_remove)
print(d)  # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d)  # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d)  # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3, 100], "b": 2222}

গভীর অনুলিপি সহ:

from copy import deepcopy


def get_dict_wo_key(dictionary, key):
    """Returns a **deep** copy of the dictionary without a key."""
    _dict = deepcopy(dictionary)
    _dict.pop(key, None)
    return _dict


d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"

new_d = get_dict_wo_key(d, key_to_remove)
print(d)  # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d)  # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d)  # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d)  # {"a": [1, 2, 3, 100], "b": 2222}

20

… একটি অনুলিপি ফেরানোর জন্য আমি অভিধান থেকে কোনও আইটেম কীভাবে মুছতে পারি (অর্থাত্ মূলটি পরিবর্তন করে না)

এ এর dictজন্য ব্যবহার করার জন্য ভুল ডেটা কাঠামো।

অবশ্যই, ডিকটি অনুলিপি করা এবং অনুলিপিটি থেকে পপিং কাজ করে এবং তাই একটি উপলব্ধি দিয়ে একটি নতুন ডিক তৈরি করছে, তবে এই সমস্ত অনুলিপি করতে সময় লাগে — আপনি একটি ধ্রুবক-সময় অপারেশনটিকে রৈখিক-সময়কালে প্রতিস্থাপন করেছেন। এবং সেই সমস্ত অনুলিপি একবারে স্থান প্রতি-প্রতি অনুলিপিতে লিনিয়ার স্পেস নেয়।

অন্যান্য ডেটা স্ট্রাকচার, যেমন হ্যাশ অ্যারে ম্যাপ করা চেষ্টাগুলি হ'ল এই ধরণের ব্যবহারের ক্ষেত্রে তৈরি করা হয়েছে: উপাদান যুক্ত করা বা অপসারণ লোগারিথেমিক সময়ে একটি অনুলিপি প্রদান করে, এর বেশিরভাগ স্টোরেজ মূলের সাথে ভাগ করে দেয়1

অবশ্যই কিছুটা ডাউনসাইড রয়েছে। পারফরম্যান্স ধ্রুবকের চেয়ে লোগারিথমিক (যদিও বড় বেস সহ, সাধারণত 32-128) 32 এবং আপনি যখন অ-পরিবর্তনকারী এপিআই-কে একরকম করতে পারেন dict, "মিউটেশন" এপিআই স্পষ্টতই আলাদা। এবং সর্বোপরি পাইথনের সাথে কোনও এইচএএমটি ব্যাটারি অন্তর্ভুক্ত নেই। 2

pyrsistentগ্রন্থাগার পাইথন জন্য HAMT ভিত্তিক অভি-প্রতিস্থাপন (এবং অন্যান্য বিভিন্ন ধরনের) এর একটি প্রশংসনীয় কঠিন বাস্তবায়ন। এমনকি বিদ্যমান মুভিং কোডটি যথাসম্ভব স্বাচ্ছন্দ্যের সাথে পোর্টিং করার জন্য এটিতে একটি নিফটি বিবর্তনকারী API রয়েছে । তবে আপনি যদি মিউটিংয়ের পরিবর্তে অনুলিপিগুলি ফিরিয়ে দিতে চান তবে আপনি কেবল এটি ব্যবহার করুন:

>>> from pyrsistent import m
>>> d1 = m(a=1, b=2)
>>> d2 = d1.set('c', 3)
>>> d3 = d1.remove('a')
>>> d1
pmap({'a': 1, 'b': 2})
>>> d2
pmap({'c': 3, 'a': 1, 'b': 2})
>>> d3
pmap({'b': 2})

যে d3 = d1.remove('a')ঠিক কি প্রশ্ন জিজ্ঞাসা করা হয়।

যদি আপনার মতো পরিবর্তনীয় ডেটা স্ট্রাকচারগুলি থাকে dictএবং এর মতো listএম্বেড থাকে তবে pmapআপনার কাছে এখনও এলিয়াসিংয়ের সমস্যা থাকবে — আপনি কেবলমাত্র সমস্ত পন্থায় নিরবচ্ছিন্ন হয়ে, pmapএস এবং pvectorএস এম্বেড করেই এটি ঠিক করতে পারেন ।


১. এইচএএমটিগুলি স্কালা, ক্লজিউর, হাস্কেলের মতো ভাষায়ও জনপ্রিয় হয়ে উঠেছে কারণ তারা লক-ফ্রি প্রোগ্রামিং এবং সফটওয়্যার লেনদেনের মেমরির সাথে খুব সুন্দর খেলে তবে এগুলির কোনওটি পাইথনের ক্ষেত্রে খুব প্রাসঙ্গিক নয়।

2. আসলে হয় stdlib একটি HAMT, বাস্তবায়ন ব্যবহৃত contextvarsআগের প্রত্যাহারকৃত পিইপি কেন তা ব্যাখ্যা করে। তবে এটি লাইব্রেরির একটি গোপন বাস্তবায়ন বিশদ, কোনও পাবলিক সংগ্রহের ধরণ নয়।


19
d = {1: 2, '2': 3, 5: 7}
del d[5]
print 'd = ', d

ফলাফল: d = {1: 2, '2': 3}


14

কেবল ডেল ডি ['কী'] কল করুন।

যাইহোক, উত্পাদনে, 'কী' d এর মধ্যে রয়েছে কিনা তা পরীক্ষা করা সবসময় ভাল অনুশীলন।

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

7
হুঁ, না, উত্পাদনে ইএএফপি আদর্শ অনুসরণ করা ভাল । কেবল try-exceptব্লকের কী সরান । কমপক্ষে, এটি একটি পারমাণবিক অপারেশন হবে;)
ম্যাক্সকরিউকোভ

1
এবং আপনি যদি সংক্ষিপ্ত হতে চান - ব্যবহার করুন d.pop('key', None), এটি অন - লাইনার। তবে আসল প্রশ্নটি ছিল একটি কী ছাড়া ডিকশনারি পাওয়ার বিষয়ে, এবং ডিকটি পরিবর্তন করার বিষয়ে নয়। সুতরাং বোধগম্যতা - এটি এখানে একটি ভাল পছন্দ;)
ম্যাক্সকরিউকোভ

7

না, ছাড়া আর কোন উপায় নেই

def dictMinus(dct, val):
   copy = dct.copy()
   del copy[val]
   return copy

তবে, প্রায়শই কেবলমাত্র কিছুটা পরিবর্তিত অভিধানের অনুলিপি তৈরি করা ভাল ধারণা নয় কারণ এটি তুলনামূলকভাবে বড় মেমরির দাবিগুলির ফলস্বরূপ। সাধারণত পুরানো অভিধানটি লগইন করা ভাল (যদি প্রয়োজন হয়) এবং তারপরে এটি পরিবর্তন করুন।


7
# mutate/remove with a default
ret_val = body.pop('key', 5)
# no mutation with a default
ret_val = body.get('key', 5)

5
>>> def delete_key(dict, key):
...     del dict[key]
...     return dict
... 
>>> test_dict = {'one': 1, 'two' : 2}
>>> print delete_key(test_dict, 'two')
{'one': 1}
>>>

এটি কোনও ত্রুটি পরিচালনার কাজ করে না, এটি ধরে নিয়েছে কীটি ডিকটিতে রয়েছে, আপনি প্রথমে এটি পরীক্ষা করতে raiseপারেন এবং যদি তা না হয়


10
আপনার পদ্ধতি কীভাবে ন্যায়বিচারের চেয়ে আলাদা del test_dict[key]?
ম্যাড পদার্থবিদ

5

এখানে একটি শীর্ষ স্তরের নকশা পদ্ধতির:

def eraseElement(d,k):
    if isinstance(d, dict):
        if k in d:
            d.pop(k)
            print(d)
        else:
            print("Cannot find matching key")
    else:
        print("Not able to delete")


exp = {'A':34, 'B':55, 'C':87}
eraseElement(exp, 'C')

আমি অভিধান এবং কীটি আমার ফাংশনে চাই তা পাস করছি, অভিধান থাকলে এটি যাচাই হয় এবং কীটি ঠিক আছে, এবং যদি উভয়ের উপস্থিতি থাকে, অভিধান থেকে মানটি সরিয়ে নিয়ে বাম-ওভারগুলি মুদ্রণ করে।

আউটপুট: {'B': 55, 'A': 34}

আশা করি এইটি কাজ করবে!


3

নীচে কোড স্নিপেট আপনাকে অবশ্যই সহায়তা করবে, আমি প্রতিটি লাইনে মন্তব্য যুক্ত করেছি যা কোড বুঝতে আপনাকে সহায়তা করবে।

def execute():
   dic = {'a':1,'b':2}
   dic2 = remove_key_from_dict(dic, 'b')  
   print(dict2)           # {'a': 1}
   print(dict)            # {'a':1,'b':2}

def remove_key_from_dict(dictionary_to_use, key_to_delete):
   copy_of_dict = dict(dictionary_to_use)     # creating clone/copy of the dictionary
   if key_to_delete in copy_of_dict :         # checking given key is present in the dictionary
       del copy_of_dict [key_to_delete]       # deleting the key from the dictionary 
   return copy_of_dict                        # returning the final dictionary

অথবা আপনি ডিক.পপ () ব্যবহার করতে পারেন

d = {"a": 1, "b": 2}

res = d.pop("c")  # No `KeyError` here
print (res)       # this line will not execute

বা আরও ভাল পদ্ধতির হয়

res = d.pop("c", "key not found")
print (res)   # key not found
print (d)     # {"a": 1, "b": 2}

res = d.pop("b", "key not found")
print (res)   # 2
print (d)     # {"a": 1}

2

তালিকা বোধগম্যতা ব্যবহার করে এখানে আরও একটি বৈকল্পিকতা দেওয়া হয়েছে:

original_d = {'a': None, 'b': 'Some'}
d = dict((k,v) for k, v in original_d.iteritems() if v)
# result should be {'b': 'Some'}

পদ্ধতির এই পোস্টের একটি উত্তরের ভিত্তিতে: একটি ডিক থেকে ফাঁকা স্ট্রিং সহ কীগুলি সরানোর কার্যকর উপায় way


1
যদি আপনি ইতিমধ্যে একটি সাধারণ, উপযুক্ত, স্বীকৃত উত্তর রয়েছে এমন একটি বছরের পুরানো প্রশ্নের উত্তর দিতে যাচ্ছেন তবে কমপক্ষে আপনার উত্তরটি সঠিক কিনা তা নিশ্চিত করুন। এটি ওপি যা বলেছিল তা করে না।
ব্যবহারকারী 2357112

আমি সাধারণত যে প্রশ্নগুলিতে মূল্যবান তথ্য যুক্ত করতে পারে তার উপর তারিখগুলি যাচাই করি না। অতিরিক্তভাবে, আমি যুক্ত প্রশ্নের সাথে মন্তব্যগুলির একটি করে: "সাধারণত কেউ এটি চায় ঠিক তেমনই হয় এবং সম্ভবত ওপি'র প্রয়োজন হয়, তবে ওপি" স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 12118695/… আমি যা চেয়েছিলাম তা নয় I জানতাম এটি প্রশ্নের সরাসরি উত্তর নয়; পরিবর্তে বিকল্পের একটি বিস্তৃতি।
বিগ ব্লুহ্যাট

3
এই উত্তরটি সম্পূর্ণ না হলেও, আমাদের শিখতে দেয় যে শর্তগুলির সাথে আমরা আইটেমগুলি সরাতে পারি। শুধু পরিবর্তন if vকরতে if k is not 'a'উত্তর অপ। তবে আমি মনে করি না এটি একটি কার্যকর উপায়, এটি পপ বা ডেল যেমন ও (লগ এন) এর চেয়ে ও (এন) এর উপাদান সরিয়ে দেয়।
হলগ্যাক 10'14

0
    species = {'HI': {'1': (1215.671, 0.41600000000000004),
  '10': (919.351, 0.0012),
  '1025': (1025.722, 0.0791),
  '11': (918.129, 0.0009199999999999999),
  '12': (917.181, 0.000723),
  '1215': (1215.671, 0.41600000000000004),
  '13': (916.429, 0.0005769999999999999),
  '14': (915.824, 0.000468),
  '15': (915.329, 0.00038500000000000003),
 'CII': {'1036': (1036.3367, 0.11900000000000001), '1334': (1334.532, 0.129)}}

নিম্নলিখিত কোডটি ডিকের অনুলিপি তৈরি করবে speciesএবং আইটেমগুলিতে মুছে ফেলা হবে নাtrans_HI

trans_HI=['1025','1215']
for transition in species['HI'].copy().keys():
    if transition not in trans_HI:
        species['HI'].pop(transition)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.