পাইথন একটি অভিধানের জন্য "প্রসারিত করুন"


462

অন্যটি দিয়ে অভিধান বাড়ানোর সর্বোত্তম উপায় কোনটি? এই ক্ষেত্রে:

>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}

আমি এই এড়ানো forলুপটি পেতে কোনও অপারেশন খুঁজছি :

{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }

আমি কিছু করতে ইচ্ছুক:

a.extend(b)  # This does not work

25
আমি তালিকাগুলির জন্য জানতাম [], তবে আমি অনুমান করি অন্যের জন্য কাজ হতে পারে, বাড়ানো হবে না ;-)
ফেরানবি

উত্তর:


694

6
দস্তাবেজগুলি পড়ার পরে একজন বুঝতে পারবেন কেন সেখানে dআপডেট ´ তবে কোনও এক্সপেনড´ নেই ´
জর্জি

58
মনে রাখবেন যে আপডেট () সরাসরি ডিকটি সংশোধন করে এবং কোনওটি প্রদান করে না।
e18r

5
তবে আপনি যদি কেবলমাত্র মানগুলি ইতিমধ্যে সংজ্ঞায়িত না করে (অর্থাত্ বিদ্যমান মানগুলি ওভাররাইট না করা) দিয়ে প্রসারিত করতে চান ? উদাহরণস্বরূপ, একজন অভি আপডেট {"a":2, "b":3}অভি সঙ্গে {"b":4, "c":5}অভি করতে {"a":2, "b":3,"c":5}? অবশ্যই update()কিছু জিনিস
এদিক ওদিক ঘুরিয়ে

17
@ নীয়ারো - কেবল বিপরীত উপায়ে আপডেট করুন; x.update (y) এর পরিবর্তে [যা y এর সাথে x মানগুলি ওভাররাইট করবে], y.update (x) [যা x এর সাথে y মানগুলিকে ওভাররাইট করে] ব্যবহার করবে এবং আরও ক্রিয়াকলাপের জন্য y আপনার নির্বাচিত আদেশ হিসাবে ব্যবহার করবে
jonathanl

মনে রাখবেন যে updateনিঃশব্দে বিদ্যমান এন্ট্রিগুলি ওভাররাইট করে। যেমন, ওভারল্যাপিং কীগুলির জন্য bওভাররাইটের কোনও মান a
সিজিএফএক্সএক্স

186

এই বদ্ধ প্রশ্নের একটি সুন্দর রত্ন :

"Oneliner উপায়", ইনপুট dicts উভয়ই পরিবর্তন, হয়

basket = dict(basket_one, **basket_two)

এখানে **basket_two(** কী ) এর অর্থ কী তা শিখুন ।

দ্বন্দ্বের ক্ষেত্রে, থেকে প্রাপ্ত আইটেমগুলি basket_twoসেগুলি থেকে ওভাররাইড করবে basket_one। ওয়ান-লাইনারগুলি যেতে যেতে এটি বেশ পঠনযোগ্য এবং স্বচ্ছ, এবং এটির ব্যবহারের বিরুদ্ধে আমার কোনও আপত্তি নেই যখনই দু'জনের মিশ্রিত একটি ডিক কাজে আসে (যে পাঠককে এটি বুঝতে সমস্যা হয় আসলে এটি খুব ভাল পরিবেশিত হবে) যেভাবে এটি তাকে বা তার সম্পর্কে dictএবং **ফর্ম ;-) সম্পর্কে জানার দিকে অনুরোধ জানায় । সুতরাং, উদাহরণস্বরূপ, এর মতো ব্যবহারগুলি:

x = mungesomedict(dict(adict, **anotherdict))

আমার কোডে যথাযথভাবে ঘন ঘন ঘটনা ঘটে।

মূলত অ্যালেক্স মার্টেলি জমা দিয়েছেন

দ্রষ্টব্য: পাইথন 3 এ, কেবলমাত্র ঝুড়ি_টায় প্রতিটি কী এক হলে এটি কাজ করবে string


3
dictকিছুটা জটিল হওয়ার জন্য ডকুমেন্টেশন সন্ধান করা সহজ **(কীওয়ার্ডটি কোয়ার্গেস )। এখানে একটি সুন্দর ব্যাখ্যা এখানে দেওয়া হয়েছে: saltycrane.com/blog/2008/01/…
জোহানোদো

4
এটি একটি একক কমান্ডের সাহায্যে দ্বিতীয় পরিবর্তনশীল তৈরি করতে ব্যবহৃত হতে পারে, যেখানে basket_one.update(<dict>)নাম হিসাবে বলা হয়েছে, একটি বিদ্যমান অভিধান (বা ক্লোনযুক্ত) আপডেট করে।
ফুরানস

2
দ্রষ্টব্য যে পাইথন 3 এ, যুক্তির নাম এবং এভাবে কীগুলির **anotherdictঅবশ্যই স্ট্রিং হওয়া উচিত।
পেটর ভিক্টরিন

ধন্যবাদ @ জোহানদো - আমি আপনার পরামর্শগুলি পোস্টে সংহত করেছি।
টম লেস

1
গৃহীত উত্তরের একটি দুর্দান্ত কার্যকরী বিকল্প। আপনার সরাসরি নতুন সম্মিলিত ডিক ব্যবহার করার প্রয়োজন হলে এই পদ্ধতির পছন্দসই। (স্বীকৃত উত্তরে @ e18r এর মন্তব্যও দেখুন)
চিনিচিনচিন

45

আপনি অভিধান ম্যাপিংয়ের সাথে অভিধান বোঝার চেষ্টা করেছেন:

a = {'a': 1, 'b': 2}
b = {'c': 3, 'd': 4}

c = {**a, **b}
# c = {"a": 1, "b": 2, "c": 3, "d": 4}

করার আরেকটি উপায় হ'ল ডিক (পুনরাবৃত্ত, ** কোয়ার্গ) ব্যবহার করে

c = dict(a, **b)
# c = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

পাইথন ৩.৯-এ আপনি ইউনিয়ন ব্যবহার করে দুটি ডিক যোগ করতে পারেন | অপারেটর

# use the merging operator |
c = a | b
# c = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

5
এফওয়াইআই: এটি পাইথন ২.7 এ বৈধ বাক্য গঠন নয়
আসভ প্যাটেল

2
এই বাক্য
গঠনটি

24
a.update(b)

থেকে কী ও মান যোগ হবে করার একটি , সেখানে ইতিমধ্যে একটি কী জন্য একটি মান যদি মুছে যাওয়ার।


17

অন্যদের উল্লেখ করেছি, a.update(b)কিছু dicts জন্য aএবং bফলাফলের আপনার প্রশ্নের জন্য জিজ্ঞাসা করেছি অর্জন করবে। যাইহোক, আমি যে বাতলান অনেকবার আমি দেখেছি চান extendম্যাপিং পদ্ধতি / সেট যে বস্তু কামনা সিনট্যাক্স মধ্যে a.extend(b), aএর মান না করে overwrite করা উচিত হবে bগুলি মান '। a.update(b)ওভাররাইটের aমানগুলি, এবং তাই এটির জন্য ভাল পছন্দ নয় extend

নোট করুন যে কিছু ভাষা এই পদ্ধতিটিকে কল করে defaultsবা injectযেমন এটি ইতিমধ্যে বিদ্যমান মানগুলিকে ওভাররাইটিং ছাড়াই একটি অভিধানে বি এর মানগুলি (যা ডিফল্ট মানগুলির সেট হতে পারে) ইনজেকশনের একটি উপায় হিসাবে বিবেচনা করা যেতে পারে।

অবশ্যই, আপনি সহজ নোট করতে পারেন যে a.extend(b)প্রায় একই b.update(a); a=b। অ্যাসাইনমেন্ট অপসারণ করতে, আপনি এটি এটি করতে পারেন:

def extend(a,b):
    """Create a new dictionary with a's properties extended by b,
    without overwriting.

    >>> extend({'a':1,'b':2},{'b':3,'c':4})
    {'a': 1, 'c': 4, 'b': 2}
    """
    return dict(b,**a)

টম লেসকে ধন্যবাদ যে স্মার্ট আইডিয়াটির জন্য পার্শ্ব-প্রতিক্রিয়া-কম dictনির্মাণকারী ব্যবহার করে extend


1

আপনি পাইথনের সংগ্রহগুলিও ব্যবহার করতে পারেন ha চ্যানম্যাপ যা পাইথন ৩.৩ এ প্রবর্তিত হয়েছিল।

from collections import Chainmap
c = Chainmap(a, b)
c['a'] # returns 1

আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে এর কয়েকটি সম্ভাব্য সুবিধা রয়েছে advant সেগুলি এখানে আরও বিশদে ব্যাখ্যা করা হয়েছে , তবে আমি একটি সংক্ষিপ্ত বিবরণ দেব:

  • একটি চেইনম্যাপ কেবল অভিধানের দৃষ্টিভঙ্গি ব্যবহার করে, তাই কোনও তথ্য আসলে অনুলিপি করা হয় না। দ্রুত শৃঙ্খলার ফলাফল (তবে ধীরে ধীরে দেখুন)
  • কোনও কী আসলেই ওভাররাইট করা হয় না, যদি প্রয়োজন হয় তবে আপনি জানেন যে ডেটা একটি বা বি থেকে আসে।

এটি মূলত কনফিগারেশন অভিধানের মতো জিনিসগুলির জন্য দরকারী করে।


0

ক্লাস হিসাবে আপনার যদি এটির প্রয়োজন হয় তবে আপনি ডিক দিয়ে এটি প্রসারিত করতে পারেন এবং আপডেট পদ্ধতিটি ব্যবহার করতে পারেন :

Class a(dict):
  # some stuff
  self.update(b)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.