পাইথন অভিধান সংজ্ঞা


386

পাইথনে (কীগুলির জন্য) একটি অভিধান বোঝার তৈরি করা সম্ভব?

তালিকা বোঝাপড়া ছাড়াই আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

l = []
for n in range(1, 11):
    l.append(n)

আমরা একটি তালিকা ধী এই কমান পারেন: l = [n for n in range(1, 11)]

তবে, বলুন যে আমি একটি অভিধানের কীগুলি একই মানটিতে সেট করতে চাই। আমি করতে পারি:

d = {}
for n in range(1, 11):
     d[n] = True # same value for each

আমি এটি চেষ্টা করেছি:

d = {}
d[i for i in range(1, 11)] = True

যাইহোক, আমি একটি পেতে SyntaxErrorউপর for

তদ্ব্যতীত (আমার এই অংশের প্রয়োজন নেই, তবে কেবল অবাক হয়ে ভাবছেন), আপনি কি অভিধানের কীগুলি বিভিন্ন মানকে একটি গোছাতে সেট করতে পারেন:

d = {}
for n in range(1, 11):
    d[n] = n

অভিধান বোঝার দ্বারা এটি কি সম্ভব?

d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]

এটি এছাড়াও SyntaxErrorউপর একটি উত্থাপন for


3
ভবিষ্যতের পাঠকদের তথ্যের জন্য: নুমপি অ্যারে আপনাকে একাধিক উপাদানকে একক মান বা মান তালিকাতে সেট করতে দেয়, আপনি যেভাবে চেষ্টা করছেন। যদিও আপনার কাছে ইতিমধ্যে NumPy ব্যবহার করার কোনও কারণ নেই তবে এটি কেবল এই বৈশিষ্ট্যের জন্য উপযুক্ত নয়।
ডেভিড জেড

উত্তর:


520

আছে পাইথন 2.7+ মধ্যে অভিধান comprehensions , কিন্তু তারা বেশ ভাবে আপনি চেষ্টা করছেন কাজ করে না। একটি তালিকা বোঝার মতো, তারা একটি নতুন অভিধান তৈরি করে ; আপনি কোনও বিদ্যমান অভিধানে কী যুক্ত করতে সেগুলি ব্যবহার করতে পারবেন না। এছাড়াও, আপনাকে কীগুলি এবং মানগুলি উল্লেখ করতে হবে, যদিও আপনি পছন্দ করেন তবে ডামি মান নির্দিষ্ট করতে পারেন।

>>> d = {n: n**2 for n in range(5)}
>>> print d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

আপনি যদি এগুলিকে সত্যতে সেট করতে চান:

>>> d = {n: True for n in range(5)}
>>> print d
{0: True, 1: True, 2: True, 3: True, 4: True}

আপনি যা মনে করছেন বলে মনে হচ্ছে তা হল একটি বিদ্যমান অভিধানে একবারে একাধিক কী সেট করার উপায়। এর জন্য কোনও সরাসরি শর্টকাট নেই। আপনি আগে যেমন দেখিয়েছেন তেমন লুপ করতে পারেন বা নতুন মানগুলির সাথে একটি নতুন ডিক তৈরি করতে আপনি অভিধানের বোঝাপড়াটি ব্যবহার করতে পারেন এবং তারপরে oldDict.update(newDict)নতুন মানগুলি পুরানো ডিক্টে একীভূত করতে পারেন।


15
FWIW, dict.updateএছাড়াও ঠিক কী-মান জোড়া একজন iterable গ্রহণ করতে পারে dictকন্সট্রাকটর
mgilson

6
মনে রাখবেন যে আপনি যদি সমস্ত মান একই সাথে অভিধান তৈরি করতে চান তবে ব্যবহার করুন dict.fromkeys()। সুতরাং সমস্ত মান সেট করতে True, ব্যবহার করুন dict.fromkeys(range(5), True)। নজর রাখুন, মানটি অনুলিপি করা হয়নি , সুতরাং যখন আপনি একটি পরিবর্তনীয় মান পাবেন তখন আপনি এটি এড়াতে চাইতে পারেন; এটি সমস্ত কীগুলির মধ্যে ভাগ করা হবে।
মার্টিজান পিটারস

2
দ্রষ্টব্য: কী একটি পদ্ধতি ফল হিসাবে ভাল হতে পারে: { n*2 : n for n in range(3) } => {0: 0, 2: 1, 4: 2}। দুটি একই অভিব্যক্তি মধ্যে সম্পন্ন করা যেতে পারে: { n*2 : n*3 for n in range(3) } => { 0: 0, 2: 3, 4: 6 }
জাইয়ের

151

আপনি dict.fromkeysক্লাস পদ্ধতিটি ব্যবহার করতে পারেন ...

>>> dict.fromkeys(range(5), True)
{0: True, 1: True, 2: True, 3: True, 4: True}

এটি একটি অভিধান তৈরি করার দ্রুততম উপায় যেখানে সমস্ত কীগুলি একই মানকে মানচিত্র করে।

তবে এটি পরিবর্তনীয় বস্তুগুলির সাথে ব্যবহার করবেন না :

d = dict.fromkeys(range(5), [])
# {0: [], 1: [], 2: [], 3: [], 4: []}
d[1].append(2)
# {0: [2], 1: [2], 2: [2], 3: [2], 4: [2]} !!!

আপনার যদি আসলে সমস্ত কীগুলি আরম্ভ করার প্রয়োজন না হয় তবে একটি defaultdictকার্যকরও কার্যকর হতে পারে:

from collections import defaultdict
d = defaultdict(True)

দ্বিতীয় অংশটির উত্তর দেওয়ার জন্য, একটি ডিক-বোধগম্যতা যা আপনার প্রয়োজন তা ঠিক:

{k: k for k in range(10)}

আপনার সম্ভবত এটি করা উচিত নয় তবে আপনি একটি সাবক্লাসও তৈরি করতে পারেন dictযা defaultdictআপনি ওভাররাইড করলে কিছুটা এমনভাবে কাজ করে যা __missing__:

>>> class KeyDict(dict):
...    def __missing__(self, key):
...       #self[key] = key  # Maybe add this also?
...       return key
... 
>>> d = KeyDict()
>>> d[1]
1
>>> d[2]
2
>>> d[3]
3
>>> print(d)
{}

নোট করুন যে ক্ষেত্রে d = defaultdict(lambda: True), ল্যাম্বডাটি ট্রু হিসাবে পরিবর্তিত (বা হওয়া উচিত নয়) প্রয়োজন হয় না।
rhbvkleef

28
>>> {i:i for i in range(1, 11)}
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10}

22

আমি @ মিগিলসন মন্তব্যটি সত্যিই পছন্দ করি, যেহেতু আপনার যদি দুটি পুনঃবারণযোগ্য শব্দ থাকে তবে একটি যদি কী এবং অন্যটির মানগুলির সাথে মিল থাকে তবে আপনি নিম্নলিখিতটিও করতে পারেন।

keys = ['a', 'b', 'c']
values = [1, 2, 3]
d = dict(zip(keys, values))

দান

d = {'a': 1, 'খ': 2, 'সি': 3


4
ডিক্ট {i:j for i in keys for j in values}
সমঝোতা

11

টিপলগুলির তালিকায় ডিক () ব্যবহার করুন, এই সমাধানটি আপনাকে প্রতিটি তালিকায় স্বেচ্ছাচারিত মান রাখতে দেয়, যতক্ষণ না সেগুলির দৈর্ঘ্য একই হয়

i_s = range(1, 11)
x_s = range(1, 11)
# x_s = range(11, 1, -1) # Also works
d = dict([(i_s[index], x_s[index], ) for index in range(len(i_s))])

12
পার্শ্ব নোট হিসাবে, এটি একই জিনিসd = dict(zip(i_s,x_s))
মিলিগ্রসন

10

অভিধান বোধগম্যতা ব্যবহার করে একটি তালিকায় শব্দের উপস্থিতি গণনা করার এই উদাহরণটি বিবেচনা করুন

my_list = ['hello', 'hi', 'hello', 'today', 'morning', 'again', 'hello']
my_dict = {k:my_list.count(k) for k in my_list}
print(my_dict)

এবং ফলাফল হয়

{'again': 1, 'hi': 1, 'hello': 3, 'today': 1, 'morning': 1}

এটি আকর্ষণীয়, যদিও আপনি একাধিকবার 'হ্যালো' এর মতো কী গণনা করতে পারবেন না এমন সবচেয়ে কার্যকর
ফিউরিয়াস জর্জি

7

একটি তালিকা বোঝার মূল উদ্দেশ্য হ'ল মূল তালিকাটি পরিবর্তন বা বিনষ্ট না করে অন্যটির উপর ভিত্তি করে একটি নতুন তালিকা তৈরি করা।

লেখার বদলে

    l = []
    for n in range(1, 11):
        l.append(n)

অথবা

    l = [n for n in range(1, 11)]

আপনার কেবল লেখা উচিত

    l = range(1, 11)

শীর্ষ দুটি কোড ব্লকে আপনি একটি নতুন তালিকা তৈরি করছেন, এর মাধ্যমে পুনরাবৃত্তি করে এবং প্রতিটি উপাদানকে ফিরে আসছেন। এটি একটি তালিকা অনুলিপি তৈরি করার ব্যয়বহুল উপায়।

অন্য কী ডিকের উপর ভিত্তি করে একই কীতে সেট করে সমস্ত কী সহ একটি নতুন অভিধান পেতে, এটি করুন:

    old_dict = {'a': 1, 'c': 3, 'b': 2}
    new_dict = { key:'your value here' for key in old_dict.keys()}

আপনি যখন একটি লেখেন তখন আপনি একটি সিনট্যাক্সেরর পেয়ে যাচ্ছেন

    d = {}
    d[i for i in range(1, 11)] = True

আপনি মূলতঃ বলছেন: "আমার আই 'আই রেঞ্জ ইন আই রেঞ্জ (1, 11)' থেকে সত্যে" এবং "আই আই রেঞ্জ ইন (1, 11)" একটি বৈধ কী নয়, এটি কেবল একটি বাক্য গঠন ত্রুটি। যদি ডিক্টগুলি সমর্থনযোগ্য তালিকাগুলি কী হিসাবে দেখায় তবে আপনি এর মতো কিছু করতে পারেন

    d[[i for i in range(1, 11)]] = True

এবং না

    d[i for i in range(1, 11)] = True

তবে তালিকাগুলি হ্যাশযোগ্য নয়, সুতরাং আপনি এগুলি ডিক কী হিসাবে ব্যবহার করতে পারবেন না।


-3

আপনি যে মত একটি তালিকা হ্যাশ করতে পারবেন না। পরিবর্তে এটি চেষ্টা করুন, এটি টিপলস ব্যবহার করে

d[tuple([i for i in range(1,11)])] = True
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.