সংগ্রহগুলি কীভাবে কাজ করে?


529

আমি পাইথন ডক্সে উদাহরণগুলি পড়েছি, তবে এই পদ্ধতির অর্থ কী তা এখনও বুঝতে পারি না। কেউ সাহায্য করতে পারেন? পাইথন ডক্সের দুটি উদাহরণ এখানে

>>> from collections import defaultdict

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]

এবং

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

পরামিতি intএবং listকি জন্য?


15
বিটিডাব্লু, আপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে , ডিফল্টর্টিক্টটি পপুলেশন শেষ করার পরে কেবল পঠনযোগ্য ব্যবহারের জন্য ডিফল্টডিক্টকে সেট করে সেট করে স্থির রাখতে ভুলবেন নাdefault_factory = Noneএই প্রশ্নটি দেখুন ।
একিউম্যানাস

উত্তর:


597

সাধারণত, KeyErrorআপনি বর্তমানে অভিধানে নেই এমন কী দিয়ে কোনও আইটেম পাওয়ার চেষ্টা করলে পাইথন অভিধানটি একটি ছুড়ে দেয় । defaultdictবিপরীতে কেবল কোনো আইটেম আপনি অ্যাক্সেস করার চেষ্টা (অবশ্যই প্রদান করা তারা এখনো উপস্থিত না থাকার) তৈরি করবে। এই জাতীয় "ডিফল্ট" আইটেম তৈরি করতে, এটি ফাংশন অবজেক্টটিকে কল করে যে আপনি নির্মাণকারীর কাছে পৌঁছেছেন (আরও স্পষ্টভাবে, এটি একটি নির্বিচারে "কলযোগ্য" অবজেক্ট, যাতে ফাংশন এবং টাইপ অবজেক্টস অন্তর্ভুক্ত রয়েছে)। প্রথম উদাহরণের জন্য, ডিফল্ট আইটেমগুলি ব্যবহার করে তৈরি করা হয় int(), যা পূর্ণসংখ্যার অবজেক্টটি ফিরিয়ে দেবে 0। দ্বিতীয় উদাহরণের জন্য, ডিফল্ট আইটেমগুলি ব্যবহার করে তৈরি করা হয় list(), যা একটি নতুন খালি তালিকার অবজেক্টটি প্রদান করে।


4
এটি কী d.get (কী, ডিফল্ট_ওয়াল) ব্যবহারের চেয়ে কার্যত ভিন্ন?
আম্বরীশ

29
@ আম্বরেশ d.get(key, default)আপনার ডিকশনারিটি কখনই সংশোধন করবে না - এটি কেবল ডিফল্টটি ফিরিয়ে দেবে এবং অভিধানটি অপরিবর্তিত রাখবে। defaultdictঅন্যদিকে, অভিধানটিতে একটি কী sertোকানো হবে যদি তা এখনও না থাকে। এটি একটি বড় পার্থক্য; কেন বুঝতে প্রশ্নে উদাহরণগুলি দেখুন।
সোভেন মার্নাচ

আমরা কীভাবে জানব যে প্রতিটি প্রকারের জন্য ডিফল্ট মান কী? 0 এর জন্য () এবং [] তালিকার জন্য () স্বজ্ঞাত, তবে আরও জটিল বা স্ব-সংজ্ঞায়িত প্রকারগুলিও থাকতে পারে।
শান

1
@ শিয়ান defaultdictআপনাকে যে কোনও কন্সট্রাক্টর পাস করার জন্য কল করে। আপনি যদি কোনও ধরণের পাস করেন তবে Tমানগুলি ব্যবহার করে নির্মিত হবে T()। কোনও প্যারামিটারে পাস না করে সব ধরণের তৈরি করা যায় না। আপনি যদি এই ধরণের একটি নির্মাণ করতে চান তবে আপনার একটি মোড়ক ফাংশন, বা এর মতো কিছু দরকার functools.partial(T, arg1, arg2)
সোভেন মারনাচ

223

defaultdictএর অর্থ হ'ল অভিধানে যদি কোনও কী না পাওয়া যায়, তবে KeyErrorনিক্ষেপ করার পরিবর্তে একটি নতুন এন্ট্রি তৈরি করা হয়। এই নতুন এন্ট্রির ধরণটি ডিফল্টডিক্ট্টের যুক্তি দ্বারা দেওয়া হয়।

উদাহরণ স্বরূপ:

somedict = {}
print(somedict[3]) # KeyError

someddict = defaultdict(int)
print(someddict[3]) # print int(), thus 0

10
"এই নতুন জুটির ধরণটি ডিফল্টডিক্ট্টের যুক্তির মাধ্যমে দেওয়া হয়েছে।" নোট করুন যে আর্গুমেন্টটি কোনও কলযোগ্য বস্তু হতে পারে - কেবলমাত্র ফাংশন টাইপ করে না। উদাহরণস্বরূপ, foo যদি "বার" ফেরত ফাংশন হয়, foo ডিফল্ট ডিকের আর্গুমেন্ট হিসাবে ব্যবহৃত হতে পারে এবং যদি একটি উপস্থিত-কীটি অ্যাক্সেস করা হয় তবে এর মানটি "বার" তে সেট করা হবে।
lf215

13
বা আপনি যদি কেবল "বার" ফিরিয়ে দিতে চান: স্যামডিক্ট = ডিফল্টডিক্ট (ল্যাম্বডা: "বার")
মাইকেল স্কট কুথবার্ট

চতুর্থ লাইন 0পূর্ণসংখ্যা ফেরত দিয়েছিল, যদি এটি হয় তবে someddict = defaultdict(list)তা ফিরে আসে [ ]। 0 ডিফল্ট পূর্ণসংখ্যা হয়? বা [] ডিফল্ট তালিকা?
গাথাইড

আমরাও। 0অপরিবর্তনীয় হয় - CPython থেকে সব মান -5থেকে 256singletons ক্যাশে হয় কিন্তু এই বাস্তবায়ন-নির্দিষ্ট আচরণ - উভয় ক্ষেত্রেই একটি নতুন নিদর্শনের সঙ্গে "তৈরি" হয় প্রতিটি সময় int()বা list()। এইভাবে, d[k].append(v)একই তালিকার রেফারেন্স সহ অভিধানটি পূরণ না করেই কাজ করতে পারে যা defaultdictপ্রায় অকেজো হয়ে যায়। যদি এই আচরণটি হত তবে defaultdictএকটি প্যারামিটার হিসাবে একটি ল্যাম্বডা নয়, মান গ্রহণ করবে। (ভয়ানক ব্যাখ্যার জন্য দুঃখিত!)
wizzwizz4

93

defaultdict

"মান অভিধানে মান পুনরুদ্ধার এবং ডিফল্ট প্রতিষ্ঠার জন্য মান সেট করার জন্য পদ্ধতি সেটডেফল্ট () অন্তর্ভুক্ত থাকে। বিপরীতে, ধারকটি আরম্ভ defaultdictকরার সাথে সাথে কলারকে ডিফল্টটিকে (ফেরত দেওয়ার মানটি) সামনের দিকে নির্দিষ্ট করতে দেয়" "

যেমন দ্বারা সংজ্ঞায়িত ডগ Hellmann মধ্যে উদাহরণ দ্বারা পাইথন স্ট্যান্ডার্ড লাইব্রেরী

কীভাবে ডিফল্টডিক্ট ব্যবহার করবেন

আমদানি ডিফল্ট

>>> from collections import defaultdict

ডিফল্টডিক্ট শুরু করুন

পাস করে এটি সূচনা করুন

callable তার প্রথম আর্গুমেন্ট হিসাবে (বাধ্যতামূলক)

>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
...     return 'default value'
... 
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(<type 'int'>, {})
>>> d_list
defaultdict(<type 'list'>, {})
>>> d_foo
defaultdict(<function foo at 0x7f34a0a69578>, {})

** এর দ্বিতীয় যুক্তি হিসাবে কোয়ার্গস ( alচ্ছিক )

>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})

অথবা

>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})

এটি কিভাবে কাজ করে

স্ট্যান্ডার্ড অভিধানের শিশু শ্রেণীর মতো এটিও একই কাজগুলি করতে পারে।

তবে কোনও অজানা কী পাস করার ক্ষেত্রে এটি ত্রুটির পরিবর্তে ডিফল্ট মান প্রদান করে। প্রাক্তন হিসাবে:

>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})

আপনি যদি ডিফল্ট মান পরিবর্তন করতে চান তবে ওভাররাইট ডিফল্ট_ফ্যাক্টরী:

>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0})

অথবা

>>> def foo():
...     return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2})

প্রশ্নের উদাহরণ

উদাহরণ 1

যেমন int- কে ডিফল্ট_ফ্যাক্টরি হিসাবে পাস করা হয়েছে, কোনও অজানা কী ডিফল্টরূপে 0 এ ফিরে আসবে।

লুপটিতে স্ট্রিংটি পাস করার সাথে সাথে এটি d তে সেই বর্ণমালার সংখ্যা বাড়িয়ে তুলবে।

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> d.default_factory
<type 'int'>
>>> for k in s:
...     d[k] += 1
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
>>> d
defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1})

উদাহরণ 2

যেহেতু একটি তালিকা ডিফল্ট_ফ্যাক্টরি হিসাবে পাস করা হয়েছে, কোনও অজানা (অস্তিত্বহীন) কীটি ডিফল্টরূপে [] (অর্থাত্‍ তালিকাতে) ফিরে আসবে।

লুপটিতে টিউপসগুলির তালিকা পাস করার সাথে সাথে এটি ডি [রঙ] এর মধ্যে মান যুক্ত করবে

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
<type 'list'>
>>> for k, v in s:
...     d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})

20

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

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

একটি ডিফল্টডিক্ট্ট কখনই কী-ইরার উত্থাপন করবে না। যে কীটি বিদ্যমান নেই তা ডিফল্ট কারখানার দ্বারা ফেরত মান পায় gets

from collections import defaultdict
ice_cream = defaultdict(lambda: 'Vanilla')

ice_cream['Sarah'] = 'Chunky Monkey'
ice_cream['Abdul'] = 'Butter Pecan'

print(ice_cream['Sarah'])
>>>Chunky Monkey

print(ice_cream['Joe'])
>>>Vanilla

এখানে ডিফল্টডিক্ট্ট কীভাবে ব্যবহার করা হয় তার অন্য একটি উদাহরণ আমরা জটিলতা হ্রাস করতে পারি

from collections import defaultdict
# Time complexity O(n^2)
def delete_nth_naive(array, n):
    ans = []
    for num in array:
        if ans.count(num) < n:
            ans.append(num)
    return ans

# Time Complexity O(n), using hash tables.
def delete_nth(array,n):
    result = []
    counts = defaultdict(int)

    for i in array:
        if counts[i] < n:
            result.append(i)
            counts[i] += 1
    return result


x = [1,2,3,1,2,1,2,3]
print(delete_nth(x, n=2))
print(delete_nth_naive(x, n=2))

উপসংহারে, যখনই আপনার অভিধানের প্রয়োজন হবে এবং প্রতিটি উপাদানের মান একটি ডিফল্ট মান দিয়ে শুরু হওয়া উচিত, একটি ডিফল্টডিক্ট্ট ব্যবহার করুন।


18

এখানে ডিফল্ট ডিসটিক্টগুলির দুর্দান্ত ব্যাখ্যা রয়েছে: http://ludovf.net/blog/python-collections-defaultdict/

মূলত, প্যারামিটারগুলি ইনট এবং লিস্ট হল এমন ফাংশন যা আপনি পাস করেন pass মনে রাখবেন পাইথন ফাংশন নামগুলি আর্গুমেন্ট হিসাবে গ্রহণ করে। int- এ আয় 0 ডিফল্ট এবং দ্বারা তালিকা আয় একটি খালি তালিকা যখন বন্ধনী সহ বলা হয়।

সাধারণ d[a]অভিধানগুলিতে , যদি আপনার উদাহরণে আমি কল করার চেষ্টা করি তবে আমি একটি ত্রুটি (কী-ইরর) পাব, যেহেতু কেবলমাত্র এম, এস, আই এবং পি বিদ্যমান আছে এবং কীটি আরম্ভ করা হয়নি। তবে ডিফল্টডিক্ট্টে এটি একটি ফাংশনটির নাম হিসাবে একটি আর্গুমেন্ট হিসাবে গ্রহণ করে, আপনি যখন কোনও কী ব্যবহার শুরু করার আগে না শুরু করার চেষ্টা করেন, তখন এটি আপনাকে প্রবেশ করানো ফাংশনটিকে সহজভাবে কল করে এবং তার মূল মানটিকে নতুন কীটির মান হিসাবে নির্ধারণ করে।


7

যেহেতু প্রশ্নটি "এটি কীভাবে কাজ করে" সম্পর্কিত, তাই কিছু পাঠক আরও বাদাম এবং বলটি দেখতে চাইতে পারেন। বিশেষত, প্রশ্নে __missing__(key)পদ্ধতিটি হ'ল পদ্ধতি। দেখুন: https://docs.python.org/2/library/collections.html#defaultdict-objects

আরও দৃ concrete়ভাবে, এই উত্তরটি __missing__(key)ব্যবহারিক উপায়ে কীভাবে ব্যবহার করতে হবে তা দেখায় : https://stackoverflow.com/a/17956989/1593924

'কলযোগ্য' এর অর্থ কী তা বোঝাতে এখানে একটি ইন্টারেক্টিভ সেশনটি হয়েছে (২.7..6 থেকে তবে v3 তেও কাজ করা উচিত):

>>> x = int
>>> x
<type 'int'>
>>> y = int(5)
>>> y
5
>>> z = x(5)
>>> z
5

>>> from collections import defaultdict
>>> dd = defaultdict(int)
>>> dd
defaultdict(<type 'int'>, {})
>>> dd = defaultdict(x)
>>> dd
defaultdict(<type 'int'>, {})
>>> dd['a']
0
>>> dd
defaultdict(<type 'int'>, {'a': 0})

এটি ছিল ডিফল্টডিক্টের সর্বাধিক সাধারণ ব্যবহার (এক্স ভেরিয়েবলের অর্থহীন ব্যবহার ব্যতীত)। আপনি 0 দিয়ে সুস্পষ্ট ডিফল্ট মান হিসাবে একই জিনিসটি করতে পারেন, তবে সাধারণ মান দিয়ে নয়:

>>> dd2 = defaultdict(0)

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    dd2 = defaultdict(0)
TypeError: first argument must be callable

পরিবর্তে, নিম্নলিখিতটি কাজ করে কারণ এটি একটি সাধারণ ফাংশনে যায় (এটি উড়ে একটি নামহীন ফাংশন তৈরি করে যা কোনও আর্গুমেন্ট নেয় না এবং সর্বদা 0 প্রদান করে):

>>> dd2 = defaultdict(lambda: 0)
>>> dd2
defaultdict(<function <lambda> at 0x02C4C130>, {})
>>> dd2['a']
0
>>> dd2
defaultdict(<function <lambda> at 0x02C4C130>, {'a': 0})
>>> 

এবং একটি ভিন্ন ডিফল্ট মান সহ:

>>> dd3 = defaultdict(lambda: 1)
>>> dd3
defaultdict(<function <lambda> at 0x02C4C170>, {})
>>> dd3['a']
1
>>> dd3
defaultdict(<function <lambda> at 0x02C4C170>, {'a': 1})
>>> 

7

আমার নিজস্ব 2 you: আপনি সাবক্লাসটি ডিফল্টর্টিক্ট ডিক্ট:

class MyDict(defaultdict):
    def __missing__(self, key):
        value = [None, None]
        self[key] = value
        return value

এটি খুব জটিল ক্ষেত্রে কার্যকর হতে পারে।


4

প্রতিটি কলের পরিবর্তে defaultdictব্যবহারের আচরণটি সহজেই নকল করা যায় ।dict.setdefaultd[key]

অন্য কথায়, কোড:

from collections import defaultdict

d = defaultdict(list)

print(d['key'])                        # empty list []
d['key'].append(1)                     # adding constant 1 to the list
print(d['key'])                        # list containing the constant [1]

সমান:

d = dict()

print(d.setdefault('key', list()))     # empty list []
d.setdefault('key', list()).append(1)  # adding constant 1 to the list
print(d.setdefault('key', list()))     # list containing the constant [1]

পার্থক্যটি হ'ল, ব্যবহারকারীর সাহায্যে defaultdictতালিকার কনস্ট্রাক্টরকে কেবল একবার ডাকা হয়, এবং dict.setdefaultতালিকাটি নির্মাণকারীকে আরও বেশিবার বলা হয় (তবে কোডটি সত্যই প্রয়োজনে এটি এড়াতে পুনরায় লেখা যেতে পারে)।

কিছু একটি পারফরম্যান্স বিবেচনা আছে তর্ক হতে পারে, কিন্তু এই বিষয় একটি খনি ক্ষেত্র। এই পোস্টটি দেখায় যে উদাহরণস্বরূপ, ডিফল্টডিক্ট ব্যবহার করার ক্ষেত্রে কোনও বড় কর্মক্ষমতা লাভ নেই।

আইএমও, ডিফল্টডিক্ট্ট এমন একটি সংগ্রহ যা কোডের সুবিধাগুলির চেয়ে আরও বিভ্রান্তি যোগ করে। আমার পক্ষে অকেজো, তবে অন্যেরা ভিন্ন কথা ভাবতে পারে।


3

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

উদাহরণ স্বরূপ:

from collections import defaultdict

d = defaultdict(list)

d['python'].append("awesome")

d['something-else'].append("not relevant")

d['python'].append("language")

for i in d.items():

    print i

এই মুদ্রণ:

('python', ['awesome', 'language'])
('something-else', ['not relevant'])

"শুরুর উপর মান ক্ষেত্রগুলির ডেটা টাইপ নির্দিষ্ট করা আছে": এটি সঠিক নয়। একটি উপাদান কারখানার ফাংশন সরবরাহ করা হয়। listঅনুপস্থিত মান পূরণ করার জন্য কল করার জন্য এখানে ফাংশন দেওয়া হচ্ছে, তৈরি করার জন্য বস্তুর ধরণ নয়। উদাহরণস্বরূপ, এর ডিফল্ট মান থাকতে 1আপনি এমন ব্যবহার করবেন lambda:1যা স্পষ্টত কোনও প্রকার নয়।
asac

2

আমি মনে করি এটি স্যুইচ কেস স্টেটমেন্টের জায়গায় সবচেয়ে ভাল ব্যবহৃত used নীচের মত যদি আমাদের একটি স্যুইচ কেস স্টেটমেন্ট থাকে তবে ভাবুন:

option = 1

switch(option) {
    case 1: print '1st option'
    case 2: print '2nd option'
    case 3: print '3rd option'
    default: return 'No such option'
}

switchপাইথনে কোনও মামলার বিবরণী পাওয়া যায় না। আমরা ব্যবহার করে এটি অর্জন করতে পারি defaultdict

from collections import defaultdict

def default_value(): return "Default Value"
dd = defaultdict(default_value)

dd[1] = '1st option'
dd[2] = '2nd option'
dd[3] = '3rd option'

print(dd[4])    
print(dd[5])    
print(dd[3])

এটি প্রিন্ট করে:

Default Value
Default Value
3rd option

উপরের স্নিপেটে ddকোনও কী বা 4 বা 5 নেই এবং তাই এটি একটি ডিফল্ট মান প্রিন্ট করে যা আমরা একটি সহায়ক ফাংশনে কনফিগার করেছি। এটি একটি কাঁচা অভিধানের চেয়ে বেশ সুন্দর যেখানে KeyErrorকী উপস্থিত না থাকলে একটি নিক্ষেপ করা হয়। এ থেকে এটি স্পষ্ট যে defaultdictআরও একটি সুইচ কেস স্টেটমেন্টের মতো যেখানে আমরা একটি জটিল if-elif-elif-elseব্লকগুলি এড়াতে পারি।

এই সাইট থেকে আমাকে আরও অনেকটা মুগ্ধ করেছে এমন আরও একটি ভাল উদাহরণ হ'ল:

>>> from collections import defaultdict
>>> food_list = 'spam spam spam spam spam spam eggs spam'.split()
>>> food_count = defaultdict(int) # default value of int is 0
>>> for food in food_list:
...     food_count[food] += 1 # increment element's value by 1
...
defaultdict(<type 'int'>, {'eggs': 1, 'spam': 7})
>>>

যদি আমরা ব্যতীত অন্য কোনও আইটেম অ্যাক্সেস করার চেষ্টা করি eggsএবং spamআমরা 0 এর একটি গণনা পেয়ে যাব।


2

ছাড়া defaultdict, আপনি সম্ভবত অদেখা কীগুলিতে নতুন মান নির্ধারণ করতে পারেন তবে আপনি এটি সংশোধন করতে পারবেন না। উদাহরণ স্বরূপ:

import collections
d = collections.defaultdict(int)
for i in range(10):
  d[i] += i
print(d)
# Output: defaultdict(<class 'int'>, {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9})

import collections
d = {}
for i in range(10):
  d[i] += i
print(d)
# Output: Traceback (most recent call last): File "python", line 4, in <module> KeyError: 0

2

ঠিক আছে, ডিফল্টডিক্ট্ট নিম্নলিখিত ক্ষেত্রে কীয়েরর উত্থাপন করতে পারে:

    from collections import defaultdict
    d = defaultdict()
    print(d[3]) #raises keyerror

সর্বদা ডিফল্টডিক্টকে ডিফল্টডিক্ট (ইনট) এর মতো যুক্তি দিতে ভুলবেন না।


0

স্ট্যান্ডার্ড অভিধানে মান পুনরুদ্ধার এবং মান বিদ্যমান না থাকলে একটি ডিফল্ট স্থাপনের জন্য পদ্ধতি সেটডেফল্ট () অন্তর্ভুক্ত করে। বিপরীতে, কন্টেইনারটি আরম্ভ করার সময় ডিফল্ট ডিটিক্ট কলারটিকে ডিফল্ট উপরে নির্দিষ্ট করতে দেয়।

import collections

def default_factory():
    return 'default value'

d = collections.defaultdict(default_factory, foo='bar')
print 'd:', d
print 'foo =>', d['foo']
print 'bar =>', d['bar']

এটি যতক্ষণ না সমস্ত কীগুলির একই ডিফল্ট থাকার জন্য উপযুক্ত ততক্ষণ কাজ করে। এটি বিশেষত কার্যকর হতে পারে যদি ডিফল্টটি এমন একটি তালিকা হয় যা মান, সংগ্রহ বা মান সংগ্রহের জন্য যেমন তালিকাগুলি, সেট বা এমনকি অন্তর্পূরণের জন্য ব্যবহৃত হয়। স্ট্যান্ডার্ড লাইব্রেরি ডকুমেন্টেশনে এইভাবে ডিফল্টডিক্ট ব্যবহারের কয়েকটি উদাহরণ অন্তর্ভুক্ত রয়েছে।

$ python collections_defaultdict.py

d: defaultdict(<function default_factory at 0x100468c80>, {'foo': 'bar'})
foo => bar
bar => default value

0

সংক্ষেপে:

defaultdict(int) - আর্গুমেন্ট INT নির্দেশ করে যে মানগুলি টাইপ হবে।

defaultdict(list) - যুক্তি তালিকাটি নির্দেশ করে যে মানগুলি তালিকার ধরণের হবে।


-9

ডকুমেন্টেশন এবং ব্যাখ্যাটি বেশ স্ব-বর্ণনামূলক:

http://docs.python.org/library/collections.html#collections.defaultdict

আর্গুমেন্ট হিসাবে প্রেরণ করা টাইপ ফাংশন (int / str ইত্যাদি) কোনও প্রদত্ত কীটির ডিফল্ট মান শুরু করার জন্য ব্যবহৃত হয় যেখানে কীটি ডিকটিতে উপস্থিত নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.