🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

পাইথন: কিভাবে দক্ষতার সাথে দুটি অভিধান একত্রিত করা যায় – 2026 এর তুলনায় সমস্ত পদ্ধতি

⏱️3 min read  ·  555 words

ডিকশনারি মার্জ করা হল পাইথন অপারেশনগুলির মধ্যে একটি। Python 3.9+ চালু করেছে| (একত্রীকরণ) অপারেটর, এখনও পরিচ্ছন্ন পদ্ধতির ক্লিনার তৈরি করে। কিন্তু অভিধানগুলিকে একত্রিত করার জন্য ছয়টি ভিন্ন উপায় রয়েছে, প্রতিটিতে ডুপ্লিকেট কী, মিউটেশন এবং কর্মক্ষমতার জন্য আলাদা আচরণ রয়েছে। এখানে প্রতিটি পদ্ধতি ব্যাখ্যা করা হয়েছে।

দ্রুত রেফারেন্স: এক নজরে সমস্ত পদ্ধতি

d1 = {"a": 1, "b": 2}
d2 = {"b": 3, "c": 4}

# 1. | operator (Python 3.9+) — RECOMMENDED for most cases
merged = d1 | d2 # {"a": 1, "b": 3, "c": 4}

# 2. |= operator — update d1 in-place (Python 3.9+)
d1 |= d2 # d1 is now {"a": 1, "b": 3, "c": 4}

# 3. ** unpacking — works in all Python 3.x
merged = {**d1, **d2} # {"a": 1, "b": 3, "c": 4}

# 4. .update() — in-place mutation
d1.update(d2) # d1 modified in-place, no return value

# 5. dict() constructor + unpacking
merged = dict(**d1, **d2) # {"a": 1, "b": 3, "c": 4}

# 6. ChainMap — lazy view of multiple dicts
from collections import ChainMap
merged = ChainMap(d1, d2) # ChainMap({'a':1,'b':2}, {'b':3,'c':4})

পদ্ধতি 1: | অপারেটর (পাইথন 3.9+ — প্রস্তাবিত)

d1 = {"name": "Alice", "age": 30}
d2 = {"age": 31, "city": "Berlin"} # 'age' exists in both

result = d1 | d2
# {"name": "Alice", "age": 31, "city": "Berlin"}
# d2 values win on duplicate keys
# d1 is NOT modified — creates new dict

# Order matters: d2 | d1 would keep d1's age value
result_reversed = d2 | d1
# {"age": 30, "city": "Berlin", "name": "Alice"}
# d1 values win on duplicate keys

অপারেটর পরিষ্কার, পঠনযোগ্য এবং দ্ব্যর্থহীন যে ডিক্ট দ্বন্দ্বে জয়ী হয়। পাইথন 3.9+ প্রকল্পের জন্য এটি পছন্দ করুন।|পদ্ধতি 2: |= ইন-প্লেস আপডেটের জন্য (পাইথন 3.9+)

ব্যবহার করুন

config = {"debug": False, "timeout": 30}
overrides = {"debug": True, "max_connections": 100}

config |= overrides
# config is now {"debug": True, "timeout": 30, "max_connections": 100}
# Modifies config in-place — no new dict created

যখন আপনি অন্যের মান সহ একটি বিদ্যমান ডিক্ট আপডেট করতে চান। সমতুল্য|= কিন্তু মার্জ শব্দার্থবিদ্যা সম্পর্কে আরও স্পষ্ট।config.update(overrides)পদ্ধতি 3: {**d1, **d2} আনপ্যাকিং (পাইথন 3.5+)

ওভাররাইড সহ একটি ডিক্ট ইনলাইন তৈরি করার সময় সবচেয়ে দরকারী — কনফিগারেশন প্যাটার্নের জন্য সাধারণ।

defaults = {"color": "blue", "size": "medium"}
user_prefs = {"color": "red", "font": "arial"}

settings = {**defaults, **user_prefs}
# {"color": "red", "size": "medium", "font": "arial"}

# Advantage: can mix with literal keys
settings = {"version": "2.0", **defaults, **user_prefs, "modified": True}
# {"version":"2.0","color":"red","size":"medium","font":"arial","modified":True}

এর চেয়ে সামান্য কম পঠনযোগ্য সহজ একত্রিত করার জন্য কিন্তু অভিব্যক্তিতে আরও নমনীয়।|পদ্ধতি 4: ইন-প্লেস মিউটেশনের জন্য .update()

সাধারণ ভুল:

# Returns None — common mistake: assigned to variable
d1 = {"a": 1}
result = d1.update({"b": 2})
print(result) # None — NOT the merged dict!
print(d1) # {"a": 1, "b": 2} — d1 was mutated

# Correct usage:
d1 = {"a": 1}
d1.update({"b": 2, "a": 99}) # duplicate key: new value wins
print(d1) # {"a": 99, "b": 2}

Common mistake:এর ফলাফল বরাদ্দ করা একটি ভেরিয়েবলে – এটি ফিরে আসে.update(). ব্যবহার করুনNone শুধুমাত্র যখন আপনি ইচ্ছাকৃতভাবে একটি নতুন তৈরি না করেই প্রথম ডিক্টটি পরিবর্তন করতে চান।.update()পদ্ধতি 5: চেইনম্যাপ — অনুলিপি ছাড়া অলস দৃশ্য

সর্বোত্তম ব্যবহারের ক্ষেত্রে:

from collections import ChainMap

defaults = {"color": "blue", "debug": False, "size": 10}
production = {"debug": True}
local = {"size": 20, "extra": "value"}

# ChainMap looks up keys in order (local first, then production, then defaults)
config = ChainMap(local, production, defaults)
print(config["debug"]) # True (from production)
print(config["color"]) # "blue" (from defaults)
print(config["size"]) # 20 (from local)

# No copy made — changes to source dicts are reflected
defaults["color"] = "green"
print(config["color"]) # "green" — live view

কনফিগারেশন লেয়ারিং (স্থানীয় → পরিবেশ → ডিফল্ট) যেখানে আপনি ডেটা অনুলিপি না করে অগ্রাধিকার-অর্ডার করা ভিউ চান। লুকআপগুলি হল O(n) যেখানে n = নির্দেশের সংখ্যা — বড় আকারের লুকআপগুলির জন্য এড়িয়ে চলুন।কর্মক্ষমতা তুলনা

সমস্ত তৈরি-নতুন-ডিক্ট পদ্ধতি একে অপরের 15% এর মধ্যে রয়েছে। ইন-প্লেস অপারেশনের জন্য,

import timeit, collections

d1 = {i: i for i in range(1000)}
d2 = {i: i*2 for i in range(500, 1500)}

# Python 3.11+ benchmarks (microseconds for 10,000 iterations)
print(timeit.timeit(lambda: d1 | d2, number=10000)) # 5.1µs
print(timeit.timeit(lambda: {**d1, **d2}, number=10000)) # 5.4µs
print(timeit.timeit(lambda: {**d1, **d2}, number=10000)) # 5.4µs
print(timeit.timeit(lambda: dict(d1, **d2), number=10000)) # 5.8µs

এবং.update() কোন নতুন ডিক্ট বরাদ্দ না থাকায় দ্রুত। বেশিরভাগ ব্যবহারের ক্ষেত্রে পারফরম্যান্সের পার্থক্য নগণ্য — পঠনযোগ্যতার উপর ভিত্তি করে বেছে নিন।|=ডিপ মার্জ (নেস্টেড ডিকশনারিজ)

প্রায়শই জিজ্ঞাসিত প্রশ্ন

# Standard merge doesn't deep-merge nested dicts
d1 = {"user": {"name": "Alice", "age": 30}}
d2 = {"user": {"email": "alice@example.com"}}

merged = d1 | d2
# {"user": {"email": "alice@example.com"}} — nested dict REPLACED not merged!

# Deep merge function
def deep_merge(base, override):
 result = base.copy()
 for key, value in override.items():
 if key in result and isinstance(result[key], dict) and isinstance(value, dict):
 result[key] = deep_merge(result[key], value)
 else:
 result[key] = value
 return result

merged = deep_merge(d1, d2)
# {"user": {"name": "Alice", "age": 30, "email": "alice@example.com"}} ✓

প্রশ্ন: পাইথন 3.9+ এ আমার কোন পদ্ধতি ব্যবহার করা উচিত?

উঃ ব্যবহার
একটি নতুন মার্জ ডিক্ট তৈরি করার জন্য। ব্যবহার করুনd1 | d2 ইন-প্লেস আপডেটের জন্য। উভয়ই আধুনিক পাইথনে সবচেয়ে পাইথনিক এবং পঠনযোগ্য।d1 |= d2প্রশ্নঃ ডুপ্লিকেট কী দিয়ে কি হয়?

উত্তর: সমস্ত স্ট্যান্ডার্ড পদ্ধতিতে, ডানদিকের (শেষ) ডিক্টের মান জয়ী হয়।
— d2 এর মান জিতেছে। d1 | d2 — d1 এর মান জিতেছে। অর্ডার প্রাধান্য নিয়ন্ত্রণ করে।{**d2, **d1}প্রশ্ন: আমি কিভাবে দুটি ডিক্ট একত্রিত করব এবং ডুপ্লিকেট কীগুলির জন্য উভয় মান রাখব?

উত্তর: একটি ডিফল্টডিক্ট বা ম্যানুয়াল লজিক ব্যবহার করুন:
. অথবা তালিকা মার্জ করার জন্য: পুনরাবৃত্তি করুন এবং সেটডিফল্ট ব্যবহার করুন।{k: [d1.get(k), d2.get(k)] for k in d1.keys() | d2.keys()}প্রশ্ন: একাধিক নির্দেশের জন্য কি এক-লাইনার আছে?

চেইন অপারেটর একত্রীকরণ. অথবা:
A: merged = {} | d1 | d2 | d3প্রশ্ন: একত্রীকরণ কি সন্নিবেশ ক্রম সংরক্ষণ করে?from functools import reduce; merged = reduce(lambda a, b: a | b, [d1, d2, d3])

উঃ হ্যাঁ। Python 3.7+ dicts সন্নিবেশ ক্রম বজায় রাখে। মার্জ করার সময়, কীগুলি ক্রমানুসারে প্রদর্শিত হয়: d1 এর অনন্য কী, তারপর d2-এর কী (d2-এর মান দিয়ে প্রতিস্থাপিত ডুপ্লিকেট সহ)।
উপসংহার

Python 3.9+ প্রকল্পের জন্য:

ব্যবহার করুন নতুন মার্জড ডিক্টস এবংd1 | d2 ইন-প্লেস আপডেটের জন্যd |= other. পুরানো পাইথনের জন্য বা জটিল এক্সপ্রেশন তৈরি করার সময়:. ব্যবহার করুন{**d1, **d2} কপি না করে কনফিগারেশন লেয়ারিংয়ের জন্য। এড়িয়ে চলুনChainMap যখন আপনি একটি রিটার্ন মান আশা করেন – এটি ফিরে আসেdict.update() এবং জায়গায় ডেটা পরিবর্তন করা সাধারণত অপরিবর্তনীয়-শৈলী কোডের জন্য ভুল পছন্দ।None এবং জায়গায় ডেটা পরিবর্তন করা সাধারণত অপরিবর্তনীয়-শৈলী কোডের জন্য ভুল পছন্দ।

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা