পাইথন ডিক কীভাবে কী তৈরি করতে বা কীতে কোনও উপাদান যুক্ত করতে হয়?


161

আমার একটা খালি অভিধান আছে। নাম: dict_x এটিতে কীগুলির মানগুলির তালিকা থাকা উচিত।

একটি পৃথক পুনরাবৃত্তি থেকে, আমি একটি কী (যেমন key_123:) এবং একটি আইটেম (একটি টিপল) dict_xএর মানটির তালিকায় রাখি key_123

যদি এই কীটি ইতিমধ্যে বিদ্যমান থাকে তবে আমি এই আইটেমটি যুক্ত করতে চাই। যদি এই কীটি বিদ্যমান না থাকে তবে আমি এটিকে একটি খালি তালিকা দিয়ে তৈরি করতে চাই এবং তারপরে সংযোজন করতে পারি বা কেবল এটিতে একটি টিপল দিয়ে এটি তৈরি করতে চাই।

ভবিষ্যতে যখন আবার এই কীটি উপস্থিত হবে, যেহেতু এটি বিদ্যমান রয়েছে, আমি আবার মানটি যুক্ত করতে চাই।

আমার কোড এ নিয়ে গঠিত:

কী এবং মান পান।

যদি দেখুন না কী রয়েছে dict_x

এবং যদি এটি তৈরি না করে: dict_x[key] == []

পরবর্তীতে: dict_x[key].append(value)

এটা কি এই উপায়? আমি কি try/exceptব্লকগুলি ব্যবহার করার চেষ্টা করব ?

উত্তর:


253

ব্যবহার dict.setdefault():

dic.setdefault(key,[]).append(value)

সহায়তা (ডিক্টেটসেটফাল্ট) :

    setdefault(...)
        D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D

4
আমি এটি করতাম dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]তবে এই উত্তরটি আরও অনেক ভাল উপায়ের প্রস্তাব দেয়। আসলে এটি set()একটি আর্গুমেন্ট হিসাবে পায় এবং আপনাকে add()পদ্ধতিটি ব্যবহার করতে দেয় ...
ফাতিহ_দুর

66

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

ব্যবহার collections.defaultdict:

import collections
dict_x = collections.defaultdict(list)

...

dict_x[key].append(value)

পেশাদাররা: সম্ভবত সেরা পারফরম্যান্স। কনস: পাইথনে ২.৪.x পাওয়া যায় না

ব্যবহার dict().setdefault():

dict_x = {}

...

dict_x.setdefault(key, []).append(value)

কনস: অব্যবহৃত list()এস এর অপর্যাপ্ত সৃষ্টি ।

ব্যবহার try ... except:

dict_x = {}

...

try:
    values = dict_x[key]
except KeyError:
    values = dict_x[key] = []
values.append(value)

বা:

try:
    dict_x[key].append(value)
except KeyError:
    dict_x[key] = [value]

হ্যালো, আপনি কেন ভাবেন?
ফিল

2
আমি মনে করি না যে .setdefault()অপ্রয়োজনীয় অভিধান তৈরি করে। আমি মনে করি যে আমি দ্বিতীয় যুক্তিতে অপ্রয়োজনীয় listগুলি তৈরি করছি (যদি []) এটি ইতিমধ্যে উপস্থিত .setdefault()থাকলে কখনও ব্যবহৃত হয় না key। আমি dict.setdefault()(দক্ষ কী হ্যাশিংয়ের সুবিধার্থে) ব্যবহার করতে পারি এবং অব্যবহৃত listগুলি পুনরায় ব্যবহার করতে একটি পরিবর্তনশীল ব্যবহার করতে পারি তবে এতে কোডের আরও কয়েকটি লাইন যুক্ত হয়।
এন্টাক

1
আইআইআরসি, পাইথনে একটি সমতার খালি তালিকা বাইটকোড স্তরে একটি ধ্রুবক হিসাবে বিবেচিত হয়, তবে এটি বাইটকোড গুরু দ্বারা কিছু নিশ্চিতকরণ প্রয়োজন (বা কেবল ডিসস মডিউলটি ব্যবহার করুন)।
চমত্কার

ব্যবহার .setdefaultএকটি নিয়মিত সৃষ্টি dictযেখানে অনুপস্থিত কী লুক-আপ একটি পরিণাম ডেকে আনবে KeyErrorযখন collections.defaultdict(list)সৃষ্টি একটি dictযেখানে অনুপস্থিত কী লুক-একটি খালি ঢোকাব listআমি মনে করি আপনি যা আচরণ যদি আপনি চান উপর ভিত্তি করে নির্বাচন করা উচিত -
Chris_Rands

আমি আমার নিজস্ব কোডে কালেকশনস ডিফল্টডিক্ট্টের অনুরূপ কিছু চেষ্টা করেছি এবং এর অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া রয়েছে। উদাহরণস্বরূপ নিম্নলিখিত আইডিএল এক্সচেঞ্জটি বিবেচনা করুন: >>> list_dict = defaultdict (list) >>> লেন (list_dict) 0 >>> লেন (list_dict [0]) 0 >>> লেন (list_dict) 1 প্রদর্শিত হবে যখন পাইথন আহ্বান জানায় ডিফল্ট মান এটি সক্রিয়ভাবে সেট না করেই অভিধানে চাবি যুক্ত করে, যা ডিফল্টটি বেশি ব্যবহার করা হলে প্রচুর খালি তালিকা তৈরি করতে চলেছে। আমি অভিধানের জন্য আমার নিজের র‍্যাপার ফাংশনগুলি রোল করতে চলেছি, অদক্ষ তবে আশা করি আরও অনুমানযোগ্য।
আরডিবারি

26

আপনি এটির জন্য একটি ডিফল্টডিক্ট্ট ব্যবহার করতে পারেন ।

from collections import defaultdict
d = defaultdict(list)
d['key'].append('mykey')

setdefaultআপনি যেগুলি ব্যবহার করে শেষ করেন না এমন নতুন তালিকাগুলি তৈরি করা শেষ না করার চেয়ে এটি কিছুটা দক্ষ । প্রতি কলটি setdefaultএকটি নতুন তালিকা তৈরি করতে যাচ্ছে, অভিধানে আইটেমটি ইতিমধ্যে বিদ্যমান থাকলেও।


14

আপনি ডিফল্টডিক্ট ইন ব্যবহার করতে পারেন collections

ডকের একটি উদাহরণ:

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

0
dictionary['key'] = dictionary.get('key', []) + list_to_append

1
নির্দিষ্ট ব্যতিক্রমগুলির উপস্থিতিতে এটির (খুব সামান্য) সুবিধাটি আপনার ব্যাখ্যা করা উচিত; কেবল কোড হিসাবে, অতিরিক্ত উত্তর কেন প্রয়োজন তা পরিষ্কার নয়।
ডেভিস হেরিং

হাই, অতিরিক্ত আমদানি ছাড়াই কেবল একটি বিকল্প। এটি একটি বিবৃতি দিয়ে পরিষ্কারভাবে করা যেতে পারে। আমি কেবল ডেট ব্যবহার করার পরিবর্তে .get () এর শক্তি ব্যবহার করে একটি বিকল্প পরামর্শ দিচ্ছি।
টমাস সিলভা Ebensperger

শীর্ষ দুটি উত্তর দুটি আমদানি ব্যতীত বিভিন্ন উপায় উল্লেখ করে (যদিও তা নয় dict.get)।
ডেভিস হেরিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.