ডিকের সূচনা করার জন্য পছন্দের সিনট্যাক্সটি কী: কোঁকড়ানো বন্ধনী আক্ষরিক lite} বা ডিক () ফাংশন?


212

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

আমি ডিক শুরু করার জন্য দুটি সাধারণ পদ্ধতি দেখছি:

a = {
    'a': 'value',
    'another': 'value',
}

b = dict( 
    a='value',
    another='value',
)

কোনটিকে "বেশি পাইথোনিক" হিসাবে বিবেচনা করা হয়? আপনি কোনটি ব্যবহার করেন? কেন?


5
আপনি কোন টিউটোরিয়াল ব্যবহার করছেন? আপনি এমন উদাহরণগুলি কোথায় দেখেছেন যা বিভ্রান্তির দিকে পরিচালিত করে?
এস .লট

2
ঠিক আছে, আমি পাইথন টিউটোরিয়ালটি ব্যবহার করেছি, পাইথনে ডুব দিন এবং তারপরে বিভিন্ন ব্লগ, এসও পোস্টস এবং অন্যান্য গুগলড রিসোর্স। সরকারী দস্তাবেজগুলি {}বেশ সমানভাবে ব্যবহার করে তবে আমি dict()অন্য কোথাও অনেকগুলি সুস্পষ্ট পদ্ধতি দেখতে পাচ্ছি । আমি একটি সুস্পষ্ট বাক্য গঠনটির সুবিধা দেখতে পেলাম, তবে সরকারী দস্তাবেজে পদ্ধতির অনুপস্থিতি আমাকে সন্দেহজনক করে তুলেছিল। এটি পোস্ট করার পরে আমি লাইব্রেরির ডক্সের দিকে নজর দিয়েছিলাম dictএবং এই সতর্কতাটি পেয়েছি যে dictকোনও ডিকটি আরম্ভ করার জন্য যখন স্পষ্টভাবে ব্যবহার করা হয় তখন কীগুলি অবশ্যই বৈধ শনাক্তকারী হতে হবে ।
দাওতাদ

2
"ডিক ()" কীভাবে "{}" এর চেয়ে বেশি স্পষ্ট? আমি আপনার বিভ্রান্তি বুঝতে পারছি না। উভয়ই আমার কাছে স্পষ্ট বলে মনে হচ্ছে। আপনি কি এমন একটি উক্তি বা রেফারেন্স সরবরাহ করতে পারেন যা আপনাকে "ডিক" "স্পষ্ট" এবং "{}" সুস্পষ্ট নয় বলে দেয়? আপনি মনে করেন যে এই পার্থক্যটি কোথা থেকে উদ্ভূত হয়েছিল?
এস .লট

21
পার্থক্য বানান। dict()বানানযুক্ত dict- এটি টাইপের নাম ব্যবহার করে। ধনুর্বন্ধনী ( {}) ধরণটি সনাক্ত করতে টাইপ সনাক্ত করে।
দাওতাদ

উত্তর:


235

কোঁকড়া ধনুর্বন্ধনী। কীওয়ার্ড আর্গুমেন্টগুলিতে পাস করা dict(), যদিও এটি প্রচুর দৃশ্যে সুন্দর করে কাজ করে, কীগুলি বৈধ পাইথন শনাক্তকারী হলে কেবল মানচিত্রের সূচনা করতে পারে।

এইটা কাজ করে:

a = {'import': 'trade', 1: 7.8}
a = dict({'import': 'trade', 1: 7.8})

এটি কাজ করবে না:

a =                  dict(import='trade', 1=7.8)
>> SyntaxError: invalid syntax  ^

85

প্রথম, কোঁকড়া ধনুর্বন্ধনী। অন্যথা, আপনি কী তাদের মধ্যে অদ্ভুত অক্ষর আছে, মত এর সাথে সঙ্গতির সমস্যার সম্মূখীন =

# Works fine.
a = {
    'a': 'value',
    'b=c': 'value',
}

# Eeep! Breaks if trying to be consistent.
b = dict( 
    a='value',
    b=c='value',
)

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

57

প্রথম সংস্করণটি পছন্দনীয়:

  • এটি সমস্ত ধরণের কীগুলির জন্য কাজ করে, তাই আপনি উদাহরণস্বরূপ বলতে পারেন {1: 'one', 2: 'two'}। দ্বিতীয় রূপটি কেবল (কিছু) স্ট্রিং কীগুলির জন্য কাজ করে। কীগুলির ধরণের উপর নির্ভর করে বিভিন্ন ধরণের সিনট্যাক্স ব্যবহার করা একটি অপ্রয়োজনীয় অসঙ্গতি হতে পারে।
  • এটি দ্রুত:

    $ python -m timeit "dict(a='value', another='value')"
    1000000 loops, best of 3: 0.79 usec per loop
    $ python -m timeit "{'a': 'value','another': 'value'}"
    1000000 loops, best of 3: 0.305 usec per loop
  • অভিধানের অক্ষরগুলির জন্য বিশেষ সিনট্যাক্সটি ব্যবহারের উদ্দেশ্যে না হলে এটি সম্ভবত উপস্থিত থাকত না।

3

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


3

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

    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False

2

কখনও কখনও dict()একটি ভাল পছন্দ:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))

mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'],

[রেডম.র্যান্ডিন্ট (0,100) এক্স রেঞ্জের জন্য (0,7)]))


2
একটি গণনা ফাংশন রয়েছে যা এটি আরও ভাল করতে পারে। এই বিষয়টির জন্য, এখানে একটি এনুম টাইপ রয়েছে যা আপনি এখানে যা করছেন তা আরও ভাল করতে পারে। এছাড়াও, এটি আসলেই কোনও প্রশ্নের উত্তর নয়।
সন্ধিক্ষেত্র

2

আমি প্রায় সবসময় কোঁকড়ানো ধনুর্বন্ধনী ব্যবহার করি; তবে, কিছু ক্ষেত্রে যেখানে আমি পরীক্ষাগুলি লিখছি, আমি কীওয়ার্ড প্যাকিং / আনপ্যাকিং করি এবং এই ক্ষেত্রে ডিক () অনেক বেশি রক্ষণাবেক্ষণযোগ্য, কারণ আমার পরিবর্তন করার দরকার নেই:

a=1,
b=2,

প্রতি:

'a': 1,
'b': 2,

এটি এমন কিছু পরিস্থিতিতেও সহায়তা করে যেখানে আমি মনে করি আমি পরবর্তী সময়ে এটিকে নামধারী বা শ্রেণীর উদাহরণে রূপান্তর করতে চাই।

বাস্তবায়নে নিজেই, অনুকূলিতকরণের প্রতি আমার আবেগের কারণে, এবং যখন আমি বিশেষত কোনও বিশাল রক্ষণাবেক্ষণের সুবিধা দেখতে পাই না, আমি সর্বদা কোঁকড়ানো-ধনুর্বন্ধনীগুলির পক্ষে থাকি।

পরীক্ষাগুলি এবং বাস্তবায়নে, আমি কী কখনই ডিক () ব্যবহার করব না যদি কীগুলি তখন বা ভবিষ্যতে যুক্ত হওয়ার সম্ভাবনা থাকে:

  • সর্বদা একটি স্ট্রিং না
  • কেবলমাত্র অঙ্ক, ASCII অক্ষর এবং আন্ডারস্কোর অন্তর্ভুক্ত নয়
  • একটি পূর্ণসংখ্যা দিয়ে শুরু করুন ( dict(1foo=2)সিনট্যাক্সেরর উত্থাপন করে)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.