উত্তর:
d = {'key': 'value'}
print(d)
# {'key': 'value'}
d['mynewkey'] = 'mynewvalue'
print(d)
# {'key': 'value', 'mynewkey': 'mynewvalue'}
.update()
পদ্ধতির মধ্যে পার্থক্য কী ? কখন ভাল হয়?
d[key]=val
সংক্ষিপ্ত আকারের হিসাবে এটি হ'ল সংক্ষিপ্ত আকারে এবং যেকোন বস্তুকে কী হিসাবে পরিচালনা করতে পারে (যতক্ষণ না এটি হ্যাশযোগ্য) কেবলমাত্র একটি মান নির্ধারণ করে, তবে .update(key1=val1, key2=val2)
আপনি যদি একই সাথে একাধিক মান সেট করতে চান তবে এটি আরও ভাল স্ট্রিং (যেহেতু কাওয়ার্গগুলি স্ট্রিংয়ে রূপান্তরিত হয়)। dict.update
অন্য একটি অভিধানও নিতে পারে, তবে আমি ব্যক্তিগতভাবে অন্য একটি আপডেট করার জন্য স্পষ্টভাবে একটি নতুন অভিধান তৈরি না করা পছন্দ করি।
$foo[ ] = [ . . . . ]
একসাথে একাধিক কী যুক্ত করতে, ব্যবহার করুন dict.update()
:
>>> x = {1:2}
>>> print(x)
{1: 2}
>>> d = {3:4, 5:6, 7:8}
>>> x.update(d)
>>> print(x)
{1: 2, 3: 4, 5: 6, 7: 8}
একটি একক কী যুক্ত করার জন্য, স্বীকৃত উত্তরের কম কম্পিউটেশনাল ওভারহেড রয়েছে।
x[-1] = 44
-1
পাইথন অভিধানগুলি সম্পর্কে একত্রীকরণ করার মত তথ্যটি আমার মনে হচ্ছে:
data = {}
# OR
data = dict()
data = {'a': 1, 'b': 2, 'c': 3}
# OR
data = dict(a=1, b=2, c=3)
# OR
data = {k: v for k, v in (('a', 1), ('b',2), ('c',3))}
data['a'] = 1 # Updates if 'a' exists, else adds 'a'
# OR
data.update({'a': 1})
# OR
data.update(dict(a=1))
# OR
data.update(a=1)
data.update({'c':3,'d':4}) # Updates 'c' and adds 'd'
data3 = {}
data3.update(data) # Modifies data3, not data
data3.update(data2) # Modifies data3, not data2
del data[key] # Removes specific element in a dictionary
data.pop(key) # Removes the key & returns the value
data.clear() # Clears entire dictionary
key in data
for key in data: # Iterates just through the keys, ignoring the values
for key, value in d.items(): # Iterates through the pairs
for key in d.keys(): # Iterates just through key, ignoring the values
for value in d.values(): # Iterates just through value, ignoring the keys
data = dict(zip(list_with_keys, list_with_values))
এটি অভিধানকে আনপ্যাকিং নামে একটি নতুন বৈশিষ্ট্য ব্যবহার করে ।
data = {**data1, **data2, **data3}
আপডেটের অপারেটর |=
এখন অভিধানের জন্য কাজ করে:
data |= {'c':3,'d':4}
একত্রীকরণ অপারেটর |
এখন অভিধানের জন্য কাজ করে:
data = data1 | {'c':3,'d':4}
আরও যোগ করতে নির্দ্বিধায়!
"পাইথন অভিধান তৈরি হওয়ার পরে কী কী যুক্ত করা সম্ভব? এটি একটি অ্যাড () পদ্ধতি আছে বলে মনে হয় না।"
হ্যাঁ এটি সম্ভব, এবং এর একটি পদ্ধতি রয়েছে যা এটি প্রয়োগ করে তবে আপনি এটি সরাসরি ব্যবহার করতে চান না।
কীভাবে এবং কীভাবে এটি ব্যবহার করবেন না তা প্রদর্শনের জন্য, আসুন ডিক আক্ষরিক সাথে একটি খালি ডিক তৈরি করুন {}
:
my_dict = {}
একক নতুন কী এবং মান দিয়ে এই ডিকটি আপডেট করার জন্য, আপনি সাবস্ক্রিপ্ট স্বরলিপিটি ব্যবহার করতে পারেন (ম্যাপিংগুলি এখানে দেখুন) যা আইটেমের কার্যভারের জন্য সরবরাহ করে:
my_dict['new key'] = 'new value'
my_dict
এখন:
{'new key': 'new value'}
update
পদ্ধতি - 2 উপায়আমরা একাধিক মান দক্ষতার পাশাপাশি ব্যবহার করে অভি আপডেট করতে পারেন পদ্ধতি । আমরা এখানে অযৌক্তিকভাবে একটি অতিরিক্ত তৈরি করতে পারি, তাই আমরা আশা করি যে ইতিমধ্যে আমাদের তৈরি করা হয়েছে এবং অন্য উদ্দেশ্যে এসেছিল বা ব্যবহৃত হয়েছিল:update
dict
dict
my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'})
my_dict
এখন:
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value'}
আপডেট পদ্ধতির সাহায্যে এটি করার আরও একটি কার্যকর উপায় কীওয়ার্ড আর্গুমেন্ট সহ, তবে যেহেতু এগুলিকে বৈধ অজগর শব্দ হতে হয়, তাই আপনার কাছে স্পেস বা বিশেষ চিহ্ন থাকতে পারে না বা একটি নাম দিয়ে নাম শুরু করা যায় না, তবে অনেকে এটিকে আরও পঠনযোগ্য উপায় হিসাবে বিবেচনা করে একটি ডিকের জন্য কী তৈরি করতে এবং এখানে আমরা অবশ্যই অতিরিক্ত অপ্রয়োজনীয় তৈরি এড়াতে চাই dict
:
my_dict.update(foo='bar', foo2='baz')
এবং my_dict
এখন:
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value',
'foo': 'bar', 'foo2': 'baz'}
সুতরাং এখন আমরা একটি আপডেট করার জন্য তিনটি পাইথোনিক উপায় কভার করেছি dict
।
__setitem__
এবং কেন এড়ানো উচিতআপডেট করার আরেকটি উপায় রয়েছে dict
যা আপনার ব্যবহার করা উচিত নয়, যা __setitem__
পদ্ধতিটি ব্যবহার করে । কীভাবে __setitem__
কী কী কীতে কী-মূল্যের জুটি যুক্ত করার জন্য পদ্ধতিটি ব্যবহার করতে পারে dict
এবং এর ব্যবহারের দুর্বল পারফরম্যান্সের একটি উদাহরণ এখানে রয়েছে :
>>> d = {}
>>> d.__setitem__('foo', 'bar')
>>> d
{'foo': 'bar'}
>>> def f():
... d = {}
... for i in xrange(100):
... d['foo'] = i
...
>>> def g():
... d = {}
... for i in xrange(100):
... d.__setitem__('foo', i)
...
>>> import timeit
>>> number = 100
>>> min(timeit.repeat(f, number=number))
0.0020880699157714844
>>> min(timeit.repeat(g, number=number))
0.005071878433227539
সুতরাং আমরা দেখতে পাচ্ছি যে সাবস্ক্রিপ্ট নোটেশন ব্যবহার করা ব্যবহারের চেয়ে আসলে খুব দ্রুত __setitem__
। পাইথোনিক জিনিসটি করা, অর্থাত্ ভাষাটি যেভাবে ব্যবহারের উদ্দেশ্যে করা হয়েছিল সেভাবে ব্যবহার করা সাধারণত পাঠযোগ্য এবং গণনার দিক থেকে উভয়ই দক্ষ।
d.__setitem__
), যদিও উপসংহারটি (এবং বিশেষত শেষ বাক্যটি) যথাযথ থেকে যায়। লুপের বাইরে থাকা পদ্ধতিটির নাম অনুসন্ধানের সময়টি হ্রাস করে প্রায় 1.65 এমএস হয়ে যায়; বাকি পার্থক্য সম্ভবত অপ্রয়োজনীয় পাইথন কল প্রক্রিয়া ওভারহেডের কারণে সম্ভবত।
dictionary[key] = value
আপনি যদি কোনও অভিধানের মধ্যে একটি অভিধান যুক্ত করতে চান তবে আপনি এটি এইভাবে করতে পারেন।
উদাহরণ: আপনার অভিধান ও উপ অভিধানে একটি নতুন এন্ট্রি যুক্ত করুন
dictionary = {}
dictionary["new key"] = "some new entry" # add new dictionary entry
dictionary["dictionary_within_a_dictionary"] = {} # this is required by python
dictionary["dictionary_within_a_dictionary"]["sub_dict"] = {"other" : "dictionary"}
print (dictionary)
আউটপুট:
{'new key': 'some new entry', 'dictionary_within_a_dictionary': {'sub_dict': {'other': 'dictionarly'}}}
দ্রষ্টব্য: পাইথনের জন্য আপনাকে প্রথমে একটি সাব যুক্ত করতে হবে
dictionary["dictionary_within_a_dictionary"] = {}
এন্ট্রি যোগ করার আগে।
dictionary = {"dictionary_within_a_dictionary": {"sub_dict": {"other" : "dictionary"}}}
(বা যদি dictionary
ইতিমধ্যে ডিক হয়, dictionary["dictionary_within_a_dictionary"] = {"sub_dict": {"other" : "dictionary"}}
)
গোঁড়া সিনট্যাক্সটি হল d[key] = value
, তবে আপনার কীবোর্ডে বর্গাকার বন্ধনী কীগুলি অনুপস্থিত থাকলে আপনি এটি করতে পারেন:
d.__setitem__(key, value)
প্রকৃতপক্ষে, সংজ্ঞা __getitem__
এবং __setitem__
পদ্ধতিগুলি হল আপনি কীভাবে বর্গাকার বন্ধনী সিনট্যাক্সটিকে নিজের শ্রেণির সমর্থন করতে পারেন। Https://python.developpez.com/cours/DiveIntoPython/php/endiveintopython/object_oriented_framework/spected_class_methods.php দেখুন
[a for a in my_dict if my_dict.update({'a': 1}) is None]
।
{v: k for k, v in my_dict.items() if <some_conditional_check>}
এই জনপ্রিয় প্রশ্ন ঠিকানাগুলি কার্মিক অভিধান মার্জ পদ্ধতি a
এবং b
।
এখানে আরও কিছু সরল পদ্ধতি রয়েছে (পাইথন 3 এ পরীক্ষিত) ...
c = dict( a, **b ) ## see also https://stackoverflow.com/q/2255878
c = dict( list(a.items()) + list(b.items()) )
c = dict( i for d in [a,b] for i in d.items() )
দ্রষ্টব্য: উপরের প্রথম পদ্ধতিটি যদি কেবল কীগুলিতে b
স্ট্রিং থাকে তবে কাজ করে।
একটি একক উপাদান যোগ করতে অথবা পরিবর্তন করতে , b
অভিধান শুধু তাই এক উপাদান হবে ...
c = dict( a, **{'d':'dog'} ) ## returns a dictionary based on 'a'
এটি সমান ...
def functional_dict_add( dictionary, key, value ):
temp = dictionary.copy()
temp[key] = value
return temp
c = functional_dict_add( a, 'd', 'dog' )
c = dict( a, **{'d':'dog'} )
c = dict(a, d='dog')
যতক্ষণ না কীগুলি জানা থাকে এবং গণনা করা হয় না ততই আরও ভাল লেখা হবে ।
আসুন আপনি ভেবে নিন যে আপনি অপরিবর্তনীয় বিশ্বে বেঁচে থাকতে চান এবং আসলটি পরিবর্তন করতে চান না তবে একটি নতুন তৈরি করতে চান dict
যা মূলটিতে একটি নতুন কী যুক্ত করার ফলাফল is
পাইথন 3.5+ এ আপনি করতে পারেন:
params = {'a': 1, 'b': 2}
new_params = {**params, **{'c': 3}}
পাইথন 2 সমতুল্য:
params = {'a': 1, 'b': 2}
new_params = dict(params, **{'c': 3})
এর যে কোনও একটির পরে:
params
এখনও সমান {'a': 1, 'b': 2}
এবং
new_params
সমান {'a': 1, 'b': 2, 'c': 3}
এমন সময় আসবে যখন আপনি আসলটি সংশোধন করতে চান না (আপনি কেবল আসলটিতে যোগ করার ফলাফল চান)। আমি এটি নিম্নলিখিত একটি সতেজ বিকল্প খুঁজে পাই:
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params['c'] = 3
অথবা
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params.update({'c': 3})
তথ্যসূত্র: https://stackoverflow.com/a/2255892/514866
**
পাইথনের সাথে পরিচিত না হন (অনেকেই নেই) তবে এটি কী হবে তা স্পষ্ট হবে না। এমন সময় রয়েছে যখন আপনি আরও ভাল পঠনযোগ্যতার জন্য কম কার্যকরী পদ্ধতির পক্ষে থাকবেন।
এতগুলি উত্তর এবং এখনও প্রত্যেকে অদ্ভুতভাবে নাম দেওয়া, অদ্ভুত আচরণ এবং এখনও কার্যকর বলে ভুলে গিয়েছিল dict.setdefault()
এই
value = my_dict.setdefault(key, default)
মূলত কেবল এটি করে:
try:
value = my_dict[key]
except KeyError: # key not found
value = my_dict[key] = default
যেমন
>>> mydict = {'a':1, 'b':2, 'c':3}
>>> mydict.setdefault('d', 4)
4 # returns new value at mydict['d']
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # a new key/value pair was indeed added
# but see what happens when trying it on an existing key...
>>> mydict.setdefault('a', 111)
1 # old value was returned
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # existing key was ignored
আপনি যদি দুটি অভিধানে যোগ দিচ্ছেন না, তবে কোনও অভিধানে নতুন কী-মান জোড় যুক্ত করছেন, তবে সাবস্ক্রিপ্ট নোটেশনটি ব্যবহার করা সবচেয়ে ভাল উপায় বলে মনে হচ্ছে।
import timeit
timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary.update({"aaa": 123123, "asd": 233})')
>> 0.49582505226135254
timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary["aaa"] = 123123; dictionary["asd"] = 233;')
>> 0.20782899856567383
তবে, আপনি যদি যুক্ত করতে চান, উদাহরণস্বরূপ, হাজার হাজার নতুন কী-মান জুড়ি, আপনার update()
পদ্ধতিটি বিবেচনা করা উচিত ।
আমি মনে করি এটা আরো পাইথন আউট বিন্দু দরকারী হবে collections
মডিউল যে অনেক দরকারী অভিধান উপশ্রেণী এবং চাদরে যে প্রক্রিয়া সহজ নিয়ে গঠিত উপরন্তু এবং তথ্য ধরনের পরিবর্তন অভিধানে , নির্দিষ্টভাবে defaultdict
:
ডিক সাবক্লাস যা অনুপস্থিত মান সরবরাহ করার জন্য একটি ফ্যাক্টরি ফাংশন কল করে
এটি বিশেষত কার্যকর যদি আপনি অভিধানে কাজ করে যা সর্বদা একই ডেটা ধরণের বা কাঠামোগুলির সমন্বয়ে থাকে, উদাহরণস্বরূপ তালিকার একটি অভিধান dictionary
>>> from collections import defaultdict
>>> example = defaultdict(int)
>>> example['key'] += 1
>>> example['key']
defaultdict(<class 'int'>, {'key': 1})
কীটি এখনও বিদ্যমান না থাকলে, defaultdict
প্রদত্ত মান (আমাদের ক্ষেত্রে 10
) অভিধানের প্রাথমিক মান হিসাবে অর্পণ করে (প্রায়শই লুপগুলির অভ্যন্তরে ব্যবহৃত হয়)। এই অপারেশনটি তাই দুটি কাজ করে: এটি অভিধানে একটি নতুন কী যুক্ত করে (প্রশ্ন অনুসারে) এবং কীটি এখনও উপস্থিত না থাকলে মান নির্ধারণ করে। মানক অভিধানের সাহায্যে, এটি একটি ত্রুটি বাড়াতে +=
পারে কারণ অপারেশনটি এমন কোনও মান অ্যাক্সেস করার চেষ্টা করছে যা এখনও বিদ্যমান নেই:
>>> example = dict()
>>> example['key'] += 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'key'
ব্যবহার না করে defaultdict
একটি নতুন উপাদান যুক্ত করার কোডের পরিমাণ অনেক বেশি হবে এবং সম্ভবত এরকম কিছু দেখাচ্ছে:
# This type of code would often be inside a loop
if 'key' not in example:
example['key'] = 0 # add key and initial value to dict; could also be a list
example['key'] += 1 # this is implementing a counter
defaultdict
জটিল ডেটা যেমন যেমন list
এবং এর সাথেও ব্যবহার করা যেতে পারে set
:
>>> example = defaultdict(list)
>>> example['key'].append(1)
>>> example
defaultdict(<class 'list'>, {'key': [1]})
একটি উপাদান যুক্ত করা স্বয়ংক্রিয়ভাবে তালিকাটিকে আরম্ভ করে।
এখানে অন্য উপায় যা আমি এখানে দেখিনি:
>>> foo = dict(a=1,b=2)
>>> foo
{'a': 1, 'b': 2}
>>> goo = dict(c=3,**foo)
>>> goo
{'c': 3, 'a': 1, 'b': 2}
অভিধানের পুনর্গঠন করতে আপনি অভিধান নির্মাণকারী এবং অন্তর্নিহিত সম্প্রসারণ ব্যবহার করতে পারেন। তদুপরি, মজার বিষয় হল, অভিধানটি নির্মাণের সময় অবস্থানিক ক্রম নিয়ন্ত্রণের জন্য এই পদ্ধতিটি ব্যবহার করা যেতে পারে ( পাইথন পরবর্তী post.6 )। প্রকৃতপক্ষে, পাইথন ৩.7 এবং তারপরের জন্য সন্নিবেশ ক্রমের গ্যারান্টিযুক্ত!
>>> foo = dict(a=1,b=2,c=3,d=4)
>>> new_dict = {k: v for k, v in list(foo.items())[:2]}
>>> new_dict
{'a': 1, 'b': 2}
>>> new_dict.update(newvalue=99)
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99}
>>> new_dict.update({k: v for k, v in list(foo.items())[2:]})
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99, 'c': 3, 'd': 4}
>>>
উপরেরটি অভিধান বোধগম্যতা ব্যবহার করছে।
কীটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করে দেখুন to
a={1:2,3:4}
a.get(1)
2
a.get(5)
None
তারপরে আপনি নতুন কী এবং মান যুক্ত করতে পারেন
অভিধান কী, মান শ্রেণি যুক্ত করুন।
class myDict(dict):
def __init__(self):
self = dict()
def add(self, key, value):
#self[key] = value # add new key and value overwriting any exiting same key
if self.get(key)!=None:
print('key', key, 'already used') # report if key already used
self.setdefault(key, value) # if key exit do nothing
## example
myd = myDict()
name = "fred"
myd.add('apples',6)
print('\n', myd)
myd.add('bananas',3)
print('\n', myd)
myd.add('jack', 7)
print('\n', myd)
myd.add(name, myd)
print('\n', myd)
myd.add('apples', 23)
print('\n', myd)
myd.add(name, 2)
print(myd)
{**mydict, 'new_key': new_val}
।