পাইথনে খালি তালিকার একটি অভিধান আমি কীভাবে শুরু করব?


89

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

data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data

আসল ফলাফল: {0: ['hello'], 1: ['hello']}

প্রত্যাশিত ফলাফল: {0: [], 1: ['hello']}

এখানে কি কাজ করে

data = {0:[],1:[]}
data[1].append('hello')
print data

আসল এবং প্রত্যাশিত ফলাফল: {0: [], 1: ['hello']}

fromkeysপ্রত্যাশার মতো পদ্ধতিটি কেন কাজ করছে না?

উত্তর:


112

[]দ্বিতীয় আর্গুমেন্ট হিসাবে পাস করা dict.fromkeys()বরং একটি অকেজো ফলাফল দেয় - অভিধানের সমস্ত মান একই তালিকার অবজেক্ট হবে।

পাইথন ২.7 বা তদূর্ধ্বতে, আপনি পরিবর্তে একটি দ্বিধাদ্বন্দ্বী ব্যবহার করতে পারেন:

data = {k: [] for k in range(2)}

পাইথনের আগের সংস্করণগুলিতে আপনি ব্যবহার করতে পারেন

data = dict((k, []) for k in range(2))

4
আচ্ছা এটি বরং অপ্রয়োজনীয় আচরণ, কেন একই আইটেমটি সমস্ত কীগুলির জন্য ব্যবহৃত হয় সে সম্পর্কে কোনও ধারণা?
বার

4
@ বার কারণ পাইথন ভাষার শব্দার্থতত্ত্বের মধ্যে ফাংশনটি আর কিছুই করতে পারে না। আপনি সমস্ত কীগুলির মান হিসাবে ব্যবহৃত হতে একটি একক বস্তুতে পাস করেন, যাতে একক অবজেক্টটি সমস্ত কীগুলির জন্য ব্যবহৃত হয়। fromkeys()পরিবর্তে কোনও কারখানার ফাংশন গ্রহণ করার পদ্ধতিটির পক্ষে এটি আরও ভাল হবে, সুতরাং আমরা listএকটি ফাংশন হিসাবে পাস করতে পারতাম , এবং সেই ফ্যানসিটনকে প্রতিটি তৈরি করা কীটির জন্য একবার ডাকা হত, তবে এটি আসল এপিআই নয় dict.fromkeys()
সোভেন মারনাচ

4
এটি মোটেই স্বজ্ঞাত নয়। এটি আমাকে খুঁজতে এক ঘন্টা সময় নিয়েছে। ধন্যবাদ
অ্যাস্ট্রিড

4
আপনি যদি দ্বিতীয় যুক্তি হিসাবে ডিক () পাস করেন তবে একই জিনিস ঘটে। খুব অবাক আচরণ।
অরলি

@ কেবলমাত্র এটি কারণ এটির জন্য প্রথমে একটি খালি অভিধান তৈরি করা হয় এবং তারপরে এটির একটি রেফারেন্স সমস্ত সূচনাতে প্রেরণ করা হয়।
ডাঃ_জাসজুś

83

ব্যবহার করুন defaultdict পরিবর্তে:

from collections import defaultdict
data = defaultdict(list)
data[1].append('hello')

আপনি তালিকার জন্য আগে ব্যবহার করতে চান এমন সমস্ত কীগুলি আপনাকে আরম্ভ করতে হবে না।

আপনার উদাহরণে যা ঘটছে তা হ'ল আপনি একটি (পরিবর্তনযোগ্য) তালিকা ব্যবহার করুন:

alist = [1]
data = dict.fromkeys(range(2), alist)
alist.append(2)
print data

আউটপুট হবে {0: [1, 2], 1: [1, 2]}


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

আমার অনুমান যে এই উত্তরটি থেকে কী অনুপস্থিত তা বলছে যে এই সমাধানটি ওপি-র বিরোধী হিসাবে কাজ করে, কারণ listএখানে খালি তালিকা নয়, তবে একটি প্রকার (বা আপনি এটি কলযোগ্য কনস্ট্রাক্টর হিসাবে দেখতে পারেন, আমার ধারণা)। সুতরাং প্রতিবার অনুপস্থিত কীটি পাস করার পরে, একইটিকে পুনরায় ব্যবহারের পরিবর্তে একটি নতুন তালিকা তৈরি করা হবে।
ডাঃ জাজজুś

8

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

d = {k : v for k in blah blah blah}

অভিধানের মানগুলি শুরু করার জন্য দুর্দান্ত পরামর্শ ... ধন্যবাদ কোবি! একটি বিদ্যমান অভিধানে মানগুলি পুনরায় সেট করতে আমি আপনার উদাহরণটি প্রসারিত করেছি, d। আমি এটি নিম্নলিখিত হিসাবে সম্পাদন করেছি: ডি = {কে: 0 কে ইন ডি}
জন

কি vএই উত্তরটি কি?
ডাঃ জাজজুś

-3

আপনি এটি ব্যবহার করতে পারেন:

data[:1] = ['hello']

4
এটি কেন কাজ করে তা ব্যাখ্যা করতে ওপিতে সহায়ক হতে পারে । আসল প্রশ্ন আকস পোস্ট করেছে কেন এটি প্রত্যাশার মতো কাজ করে না।
william.taylor.09

@ william.taylor.09 এটি কেন স্পষ্টভাবে প্রকাশিত যে এটি কাজ করে, তাইনা?
কনার দাসসেন

ওপি (জিজ্ঞাসা করছে) জিজ্ঞাসা করছে "কেন থোকেস পদ্ধতিটি প্রত্যাশার মতো কাজ করছে না?"
william.taylor.09
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.