d3 = dict(d1, **d2)
আমি বুঝতে পারি যে এটি অভিধানকে একীভূত করে। তবে, এটি কি অনন্য? যদি ডি 1 এর একই কী কী ডি 2 তবে ভিন্ন মান থাকে? আমি d1 এবং d2 একত্রিত করতে চাই, তবে ডুপ্লিকেট কী থাকলে ডি 1 এর অগ্রাধিকার রয়েছে।
d3 = dict(d1, **d2)
আমি বুঝতে পারি যে এটি অভিধানকে একীভূত করে। তবে, এটি কি অনন্য? যদি ডি 1 এর একই কী কী ডি 2 তবে ভিন্ন মান থাকে? আমি d1 এবং d2 একত্রিত করতে চাই, তবে ডুপ্লিকেট কী থাকলে ডি 1 এর অগ্রাধিকার রয়েছে।
উত্তর:
আপনি ব্যবহার করতে পারেন .update()আপনার আর আর মূল প্রয়োজন না থাকলে আপনি পদ্ধতিটিd2 :
বিদ্যমান কীগুলি ওভাররাইট করে অন্যের কী / মান জোড় দিয়ে অভিধানটি আপডেট করুন । রিটার্ন
None।
যেমন:
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'b': 1, 'c': 3}
>>> d2.update(d1)
>>> d2
{'a': 1, 'c': 3, 'b': 2}
হালনাগাদ:
একটি নতুন মার্জড তৈরির জন্য অবশ্যই আপনি অভিধানটি অনুলিপি করতে পারেন। এটি প্রয়োজন বা নাও হতে পারে। আপনার অভিধানে যৌগিক অবজেক্টস (অন্যান্য বিষয়বস্তুগুলির তালিকা, বা শ্রেণীর উদাহরণগুলির মতো পদার্থ) রয়েছে copy.deepcopyসে ক্ষেত্রেও বিবেচনা করা উচিত।
isinstance(int, object) is Trueতবে deepcopyপ্রয়োজনীয় মনে হচ্ছে না।
পাইথন 2 এ,
d1={'a':1,'b':2}
d2={'a':10,'c':3}
d1 ওভাররাইড ডি 2:
dict(d2,**d1)
# {'a': 1, 'c': 3, 'b': 2}
d2 ওভাররাইড ডি 1:
dict(d1,**d2)
# {'a': 10, 'c': 3, 'b': 2}
এই আচরণটি বাস্তবায়নের এক মাত্রা নয়; এটি ডকুমেন্টেশনে গ্যারান্টিযুক্ত :
যদি কোনও কী উভয় অবস্থানগত আর্গুমেন্টে এবং কীওয়ার্ড আর্গুমেন্ট হিসাবে নির্দিষ্ট করা থাকে, অভিধানে কীওয়ার্ডের সাথে সম্পর্কিত মানটি বজায় রাখা হয়।
**স্বরলিপি সহ একটি ডিক পাস করার সময় সেই ডিকের সমস্ত কী স্ট্রিং হওয়া উচিত। আরও জানতে অজগর-দেব থ্রেডটি mail.python.org/pipermail/python-dev/2010- এপ্রিল/ 099427 . html থেকে শুরু করে দেখুন।
d = dict(**d1, **d2)কাজ করে তা বলতে যাচ্ছিলাম , কিন্তু এটিই তাদের মন্তব্যে @ ইওনানিস ফিলিপিস রেফারেন্স করে। সম্ভবত এখানে স্নিপেট সহ আরও পরিষ্কার হয়ে যেত, তাই এটি এখানে।
আমার সমাধানটি হচ্ছে মার্জ ফাংশনটি সংজ্ঞায়িত করা । এটি পরিশীলিত নয় এবং কেবল একটি লাইনের দাম। পাইথন 3 এ কোডটি এখানে।
from functools import reduce
from operator import or_
def merge(*dicts):
return { k: reduce(lambda d, x: x.get(k, d), dicts, None) for k in reduce(or_, map(lambda x: x.keys(), dicts), set()) }
পরীক্ষা
>>> d = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> d_letters = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d, d_letters)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d_letters, d)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge(d)
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> merge(d_letters)
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h', 8: 'i', 9: 'j', 10: 'k', 11: 'l', 12: 'm', 13: 'n', 14: 'o', 15: 'p', 16: 'q', 17: 'r', 18: 's', 19: 't', 20: 'u', 21: 'v', 22: 'w', 23: 'x', 24: 'y', 25: 'z', 26: 'A', 27: 'B', 28: 'C', 29: 'D', 30: 'E', 31: 'F', 32: 'G', 33: 'H', 34: 'I', 35: 'J', 36: 'K', 37: 'L', 38: 'M', 39: 'N', 40: 'O', 41: 'P', 42: 'Q', 43: 'R', 44: 'S', 45: 'T', 46: 'U', 47: 'V', 48: 'W', 49: 'X', 50: 'Y', 51: 'Z'}
>>> merge()
{}
এটি অভিধানে যুক্তিগুলি নির্বিচারে কাজ করে। এই অভিধানগুলিতে কোনও সদৃশ কী আছে, তর্ক তালিকার ডানদিকের অভিধান থেকে কীটি জিতেছে।
.updateকল সহ একটি সাধারণ লুপ ( merged={}তারপরে for d in dict: merged.update(d)) খাটো হবে, আরও পাঠযোগ্য এবং আরও দক্ষ।
reduceএবং lambdaসেগুলি কীভাবে return reduce(lambda x, y: x.update(y) or x, dicts, {})?
ট্রে হানারের একটি দুর্দান্ত ব্লগ পোস্ট রয়েছে যা একাধিক ডিকশনারি মার্জ করার জন্য বিভিন্ন বিকল্পের রূপরেখার সাথে রয়েছে (পাইথন ৩৩.৩+ এর জন্য) চ্যানম্যাপ এবং অভিধান আনপ্যাকিং সহ ।
শুরু করে Python 3.9, অপারেটর |দুটি অভিধান থেকে মার্জ করা কী এবং মানগুলির সাথে একটি নতুন অভিধান তৈরি করে:
# d1 = { 'a': 1, 'b': 2 }
# d2 = { 'b': 1, 'c': 3 }
d3 = d2 | d1
# d3: {'b': 2, 'c': 3, 'a': 1}
এই:
ডি 2 এবং ডি 1 এর একত্রীকরণ কী এবং মানগুলির সাহায্যে একটি নতুন অভিধান ডি 3 তৈরি করে। ডি 2 এবং ডি 1 কীগুলি ভাগ করে নেওয়ার সময় ডি 1 এর মানগুলি অগ্রাধিকার নেয়।
এছাড়াও |=অপারেটরটি নোট করুন যা D1 মানগুলিতে অগ্রাধিকার সহ d1 ইন মার্জ করে d2 সংশোধন করে:
# d1 = { 'a': 1, 'b': 2 }
# d2 = { 'b': 1, 'c': 3 }
d2 |= d1
# d2: {'b': 2, 'c': 3, 'a': 1}
আমি বিশ্বাস করি যে, উপরে বর্ণিত হিসাবে, ব্যবহার করা d2.update(d1)হ'ল সর্বোত্তম পন্থা এবং আপনার d2যদি এখনও প্রয়োজন হয় তবে আপনি প্রথমে অনুলিপিও করতে পারেন ।
যদিও, আমি এটি উল্লেখ করতে চাই যে dict(d1, **d2)সাধারণভাবে ডিকশনারিগুলিকে একীভূত করার একটি খারাপ উপায় কারণ মূলশব্দ যুক্তিগুলির স্ট্রিং হওয়া দরকার, সুতরাং আপনার যদি এর dictমতো থাকে তবে এটি ব্যর্থ হবে :
{
1: 'foo',
2: 'bar'
}
**কীওয়ার্ড আর্গুমেন্টের অপব্যবহার হিসাবে বিবেচিত হবে যদি না সমস্ত কীগুলিd2স্ট্রিং না হয়। যদি সমস্ত কীগুলিd2স্ট্রিং না হয় তবে পাইথন ৩.২ এ এটি ব্যর্থ হয় এবং পাইথনের বিকল্প বাস্তবায়নে যেমন জাইথন, আয়রন পাইথন এবং পাইপাই। উদাহরণস্বরূপ, mail.python.org/pipermail/python-dev/2010- এপ্রিল / 099459 . html দেখুন ।