পাইথন-এ যখন কোনও অভিধান বনাম টুপল ব্যবহার করবেন


31

মনের মধ্যে নির্দিষ্ট উদাহরণ ফাইল নাম এবং তাদের আকারের একটি তালিকা। আমি সিদ্ধান্ত নেন পারছে না যে তালিকাতে থাকা প্রতিটি আইটেম রুপে হওয়া উচিত {"filename": "blabla", "size": 123}বা শুধু, ("blabla", 123)। একটি অভিধান আমার কাছে আরও যুক্তিযুক্ত বলে মনে হয় কারণ আকারটি অ্যাক্সেস করার জন্য, উদাহরণস্বরূপ, এর file["size"]চেয়ে বেশি ব্যাখ্যাযোগ্য file[1]... তবে আমি নিশ্চিতভাবে জানি না। থটস?


সংযোজন হিসাবে, টিউপল আনপ্যাকিং বিবেচনা করুন , আপনি যদি টিউপসগুলির পাঠযোগ্যতার বিষয়ে চিন্তা করেন - fname, file_size = fileযেখানে ডেটাটি আপনার উপরের টিপল, এটি সরিয়ে নিয়ে file[1]প্রতিস্থাপন করবে file_size। অবশ্যই এটি একটি ভাল ডকুমেন্টেশনের উপর নির্ভর করে।
nlsdfnbch

2
এটি নির্ভর করে যে আপনি কোন ডেটা কাঠামোটি তৈরি করছেন এবং আপনি কীভাবে এটি অ্যাক্সেস করার ইচ্ছা রাখছেন? (ফাইলের নাম দিয়ে? সূচক অনুসারে? উভয়?) এটি কি কেবল একটি বহনযোগ্য ভেরিয়েবল / ডেটা কাঠামো, বা আপনি সম্ভবত অন্যান্য আইটেমগুলি (/ বৈশিষ্ট্যগুলি) পাশাপাশি আকার যুক্ত করবেন? কাঠামোর কোনও অর্ডার মনে রাখা দরকার; আপনি কি আকারের তালিকাটি বাছাই করতে চান বা অবস্থান দ্বারা এটি অ্যাক্সেস করতে চান (যেমন "শীর্ষ-এন বৃহত্তম / ক্ষুদ্রতম ফাইল")? সেগুলির উপর নির্ভর করে, 'সেরা' উত্তরটি হ'ল আদেশ, অর্ডারডিক্ট, নেমটুপল, সরল পুরাতন তালিকা বা আপনার নিজস্ব কাস্টম শ্রেণি হতে পারে। আপনার কাছ থেকে আরও প্রসঙ্গ প্রয়োজন।
smci

উত্তর:


78

আমি একটি ব্যবহার করব namedtuple:

from collections import namedtuple
Filesize = namedtuple('Filesize', 'filename size')
file = Filesize(filename="blabla", size=123)

এখন আপনি ব্যবহার করতে পারেন file.sizeএবং file.filenameআপনার প্রোগ্রামে যা IMHO সর্বাধিক পঠনযোগ্য ফর্ম। নোট namedtupleটিউপলসের মতো অপরিবর্তনীয় বস্তু তৈরি করে এবং এগুলি এখানে বর্ণিত হিসাবে অভিধানের তুলনায় বেশি হালকা ।


1
ধন্যবাদ, ভাল ধারণা, আজকের আগে তাদের সম্পর্কে কখনও শুনেনি (আমি পাইথনের দিকে বেশ অভিনব)। প্রশ্ন: কোডের অন্য কোথাও যদি একই "শ্রেণি" সংজ্ঞায়িত করা হয়, তবে সম্ভবত কিছুটা পৃথকভাবে কী ঘটবে। উদাহরণস্বরূপ, অন্য কোনও উত্স ফাইলে সহকর্মী ববFilesize = namedtuple('Filesize', 'filepath kilobytes')
ইউজার 949300

আপনি খুব সুন্দর attrsমডিউলটিও এটি ব্যবহার করতে পারেন (এটির মাধ্যমে pipএটি সন্ধান করতে পারেন বা কেবল এটি সন্ধান করতে পারেন), যা আপনাকে নামকরণিত টিউপলের সাথে খুব অনুরূপ সিনট্যাকটিক সুবিধা দিতে দেয়, তবে আপনাকে পরিবর্তন আনতে পারে (তবে এটি অপরিবর্তনীয়ও করা যায়)। প্রধান কার্যকরী পার্থক্য হ'ল- attrsতৈরি ক্লাসগুলি প্লেইন টিউপসগুলির সাথে সমান তুলনা করে না , সেভাবেই namedtuple
mtraceur

3
@ ডকব্রাউন পাইথনের ঘোষণার কোনও ধারণা নেই। class, defএবং =সমস্ত কেবল পূর্ববর্তী কোনও ব্যবহারগুলি ওভাররাইট করে। repl.it
চ্যালেঞ্জার 5

@ চ্যালেঞ্জার 5: আপনি ঠিক বলেছেন, আমার ভুল, তাই সঠিক উত্তরটি হল: সর্বশেষ সংজ্ঞা গণনা করা, পাইথন রানটাইম থেকে কোনও ত্রুটি নয়, তবে অন্য কোনও পরিবর্তনশীলের মতো একই আচরণ।
ডক ব্রাউন

8
নোট করুন যে namedtupleঅপরিবর্তনীয় গুণাবলী সহ নতুন ধরণের জন্য মূলত একটি সংক্ষিপ্ত হাত ঘোষণা। এর মানে হল উত্তর কার্যকরভাবে হয়, "কোন tupleঅথবা একটি dict, কিন্তু একটি object।" +1
jpmc26

18

file "ফাইলের নাম": "ব্লেবলা", "আকার": 123}, বা কেবল ("ব্লেবলা", 123)

আপনার ফর্ম্যাট / স্কিমা ইন-ব্যান্ড বা আউট-ব্যান্ডটি এনকোড করা হবে কিনা এটি এই পুরানো প্রশ্ন।

আপনি পাঠযোগ্যতা এবং বহনযোগ্যতা পেতে কিছু মেমরি বাণিজ্য করেন যা ডেটায় ড্যাটারের বিন্যাসটি প্রকাশ করে আসে। যদি আপনি এই জ্ঞানটি না করেন তবে প্রথম ক্ষেত্রটি ফাইলের নাম এবং দ্বিতীয়টি আকারটি অন্য কোথাও রাখতে হবে। এটি স্মৃতি সংরক্ষণ করে তবে এটি পড়ার ক্ষমতা এবং বহনযোগ্যতা ব্যয় করে। কোনটি আপনার সংস্থার বেশি অর্থ ব্যয় করতে চলেছে?

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

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

তবে, আমি যা করতে পারি না তা হ'ল দুটি স্বতন্ত্রভাবে সংজ্ঞায়িত ফর্ম্যাটগুলি একত্রিত করা যায় যার কয়েকটি ওভারল্যাপিং ক্ষেত্র রয়েছে, কিছু না, সেগুলি একটি ফর্ম্যাটে সংরক্ষণ করে এবং এটি কেবল এমন এক জিনিস বা অন্যান্য ফর্ম্যাট সম্পর্কে জানে এমন জিনিসগুলির জন্য কার্যকর হতে পারে।

এটি করতে আমার শুরু থেকে ফর্ম্যাট তথ্য এনকোড করা প্রয়োজন। আমাকে বলতে হবে "এই ক্ষেত্রটি ফাইলের নাম"। যা একাধিক উত্তরাধিকারের অনুমতি দেয়।

আপনি সম্ভবত উত্তরাধিকার হিসাবে কেবল বস্তুর প্রসঙ্গে প্রকাশিত হওয়ার জন্য ব্যবহার করেছেন তবে একই ধারণাগুলি ডেটা ফর্ম্যাটগুলির জন্য কাজ করে কারণ ভাল, অবজেক্টগুলি ডেটা ফর্ম্যাটগুলিতে সঞ্চিত থাকে। এটা ঠিক একই সমস্যা।

সুতরাং আপনার যেটিকে সম্ভবত সবচেয়ে বেশি প্রয়োজন তা ব্যবহার করুন। আমি নমনীয়তার দিকে পৌঁছে যাই যদি না আমি একটি ভাল কারণ না উল্লেখ করতে পারি।


3
সত্য কথা বলতে গেলে, আমি সন্দেহ করি যে কেউ ইন-ব্যান্ড বা আউট-অফ-ব্যান্ড ফর্ম্যাটটি ব্যবহারের মধ্যে অনিশ্চিত রয়েছে তার এমন কঠোর পারফরম্যান্স প্রয়োজনীয়তা রয়েছে যে তাদের আউট-অফ-ব্যান্ড ফর্ম্যাটটি ব্যবহার করা দরকার
আলেকজান্ডার - মনিকা

2
@ আলেকজান্ডার খুব সত্য। আমি এটি সম্পর্কে লোকদের শেখাতে পছন্দ করি যাতে তারা বুঝতে পারে যে বাইরে-ব্যান্ড সমাধানের সাথে মুখোমুখি হওয়ার সময় তারা কী দেখছে। বাইনারি ফর্ম্যাটগুলি প্রায়শই অবহেলার কারণে এটি করে। সবাই পোর্টেবল হতে চায় না। পারফরম্যান্সের কারণ হিসাবে, যদি এটি আউট অফ-ব্যান্ডের আশ্রয় নেওয়ার আগে সংক্ষেপণ বিবেচনা করে matters
candied_orange 21

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

@ ডাগরুমগুলি পাইথনকে ঘৃণা করবে না এটি অনেক ক্ষেত্রে ভাল পারফর্ম করে। তবে অন্যথায় আপনারা যা বলেছেন তার সাথে আমি সম্মত। আমার বক্তব্যটি ছিল "এই কারণেই লোকেরা তা করে। আপনি সম্ভবত যত্ন নেবেন না কেন এখানে।"
candied_orange

@ ক্যান্ডিওডআরেঞ্জ আমি ভাষা ঘৃণা করি না, আমি এটি আমার দৈনন্দিন কাজে ব্যবহার করি। লোকেরা যেভাবে এটি ব্যবহার করে তা আমি পছন্দ করি না।
ডাগরুম

7

আমি দুটি বৈশিষ্ট্য সহ একটি শ্রেণি ব্যবহার করব। file.sizeহয় file[1]বা তুলনায় ভাল file["size"]

সহজ জটিল চেয়ে ভাল।


যদি কেউ ভাবছেন: জেএসএনএস উত্পন্ন করার জন্য, উভয়ই সমানভাবে ভালভাবে কাজ করে: file = Filesize(filename='stuff.txt', size=222)এবং filetup = ("stuff.txt", 222)উভয়ই একই জেএসওএন উত্পন্ন করে: json.dumps(file)এবং json.dumps(filetup)ফলস্বরূপ:'["stuff.txt", 222]'
জুহা উন্টিনেন

5

ফাইলের নামগুলি কি অনন্য? যদি তা হয় তবে আপনি তালিকাটি পুরোপুরি স্ক্র্যাপ করতে এবং সমস্ত ফাইলের জন্য একটি খাঁটি অভিধান ব্যবহার করতে পারেন। যেমন (একটি অনুমান ওয়েবসাইট)

{ 
  "/index.html" : 5467,
  "/about.html" : 3425,
  "/css/main.css" : 9876
}

ইত্যাদি ...

এখন, আপনি "নাম" এবং "আকার" পান না, আপনি কেবল কী এবং মান ব্যবহার করেন তবে প্রায়শই এটি বেশি প্রাকৃতিক। YMMV।

আপনি যদি স্পষ্টতার জন্য সত্যিই একটি "আকার" চান, বা আপনার ফাইলের জন্য একাধিক মানের প্রয়োজন হয় তবে:

{ 
   "/index.html" : { "size": 5467, "mime_type" : "foo" },
   "/about.html" : { "size": 3425, "mime_type" : "foo" }
   "/css/main.css" : { "size": 9876, "mime_type" : "bar" }
}

0

পাইথনে, অভিধান হ'ল পরিবর্তনযোগ্য অবজেক্ট। অন্যদিকে, tuple অপরিবর্তনীয় বস্তু।

আপনার যদি অভিধান কী পরিবর্তন করতে হয় তবে প্রায়শই বা প্রতিবার মান জোড়। আমি অভিধান ব্যবহার করার পরামর্শ দিই।

আপনার যদি স্থির / স্থিতিশীল ডেটা থাকে তবে আমি ব্যবহার করতে টিপলকে পরামর্শ দেব।

# dictionary define.
a = {}
a['test'] = 'first value'

# tuple define.
b = ()
b = b+(1,)

# here, we can change dictionary value for key 'test'
a['test'] = 'second'

কিন্তু, এসাইনমেন্ট অপারেটরটি ব্যবহার করে টুপল ডেটা পরিবর্তন করতে সক্ষম নয়।

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