আমার কাছে এমন একটি dict
রয়েছে যা পুরো পুরো এন্ট্রি রাখে। আমি কেবলমাত্র তাদের কয়েকটিতে আগ্রহী। অন্য সবগুলি ছাঁটাই করার কোনও সহজ উপায় আছে?
আমার কাছে এমন একটি dict
রয়েছে যা পুরো পুরো এন্ট্রি রাখে। আমি কেবলমাত্র তাদের কয়েকটিতে আগ্রহী। অন্য সবগুলি ছাঁটাই করার কোনও সহজ উপায় আছে?
উত্তর:
একটি নতুন ডিক নির্মাণ:
dict_you_want = { your_key: old_dict[your_key] for your_key in your_keys }
অভিধান বোঝার ব্যবহার করে।
আপনি যদি এমন কোনও সংস্করণ ব্যবহার করেন যা এগুলির অভাব রয়েছে (যেমন পাইথন ২.6 এবং তার আগের), এটি তৈরি করুন dict((your_key, old_dict[your_key]) for ...)
। এটা একই, যদিও কৃপণ।
নোট করুন যে, jnnnn এর সংস্করণের বিপরীতে old_dict
, কোনও আকারের জন্য স্থিতিশীল পারফরম্যান্স রয়েছে (কেবলমাত্র আপনার_কিজের সংখ্যার উপর নির্ভর করে) । গতি এবং স্মৃতি উভয় ক্ষেত্রে। যেহেতু এটি একটি জেনারেটর এক্সপ্রেশন তাই এটি একবারে একটি আইটেম প্রসেস করে এবং এটি পুরানো_ডিক্টের সমস্ত আইটেমের মধ্যে দেখতে পায় না।
জায়গায় থাকা সমস্ত কিছু সরিয়ে ফেলা হচ্ছে:
unwanted = set(keys) - set(your_dict)
for unwanted_key in unwanted: del your_dict[unwanted_key]
old_dict
অন্য কোথাও বাগ নির্দেশ করে এবং সেই ক্ষেত্রে আমি নিঃশব্দে ভুল ফলাফলের জন্য একটি ত্রুটি পছন্দ করি।
সামান্য আরও মার্জিত ডিক বোধগম্যতা:
foodict = {k: v for k, v in mydict.items() if k.startswith('foo')}
mydict.iteritems()
পরিবর্তে ব্যবহার করা হলে সম্ভবত একই পারফ হতে হবে। .items()
অন্য তালিকা তৈরি করে।
পাইথন ২.6-এর একটি উদাহরণ এখানে রয়েছে:
>>> a = {1:1, 2:2, 3:3}
>>> dict((key,value) for key, value in a.iteritems() if key == 1)
{1: 1}
ফিল্টারিং অংশটি if
স্টেটমেন্ট।
আপনি যদি খুব কয়েকটি কী ব্যবহার করতে চান তবে এই পদ্ধতিটি দেলানানের উত্তরের চেয়ে ধীর।
if key in ('x','y','z')
আমি অনুমান ব্যবহার করি
আপনি আমার মজাদার লাইব্রেরি থেকে প্রকল্প ফাংশন দিয়ে এটি করতে পারেন :
from funcy import project
small_dict = project(big_dict, keys)
সিলেক্ট_কিজগুলি একবার দেখুন ।
কোড 1:
dict = { key: key * 10 for key in range(0, 100) }
d1 = {}
for key, value in dict.items():
if key % 2 == 0:
d1[key] = value
কোড 2:
dict = { key: key * 10 for key in range(0, 100) }
d2 = {key: value for key, value in dict.items() if key % 2 == 0}
কোড 3:
dict = { key: key * 10 for key in range(0, 100) }
d3 = { key: dict[key] for key in dict.keys() if key % 2 == 0}
কোড পারফরম্যান্সের সমস্ত পাইক সংখ্যা = 1000 ব্যবহার করে টাইমিট দিয়ে পরিমাপ করা হয় এবং কোডের প্রতিটি অংশের জন্য 1000 বার সংগ্রহ করা হয়।
অজগর 3.6 এর জন্য ফিল্টার ডিক কীগুলির তিনটি উপায়ে প্রায় একই রকমের পারফরম্যান্স। পাইথনের জন্য ২.7 কোড 3 কিছুটা দ্রুত is
এই এক লাইনার ল্যাম্বডায় কাজ করা উচিত:
dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ])
এখানে একটি উদাহরণ:
my_dict = {"a":1,"b":2,"c":3,"d":4}
wanted_keys = ("c","d")
# run it
In [10]: dictfilt(my_dict, wanted_keys)
Out[10]: {'c': 3, 'd': 4}
এটি আপনার মৌলিক তালিকার বোধগম্যতা যা আপনার ডিক কী (i x x) এর উপর পুনরাবৃত্তি করে এবং টিপল (কী, মান) জোড়গুলির একটি তালিকা আউটপুট দেয় যদি কী আপনার পছন্দসই কী তালিকায় থাকে (y)। একটি ডিক () পুরো জিনিসটি একটি ডিক অবজেক্ট হিসাবে আউটপুটে মোড়ানো করে।
set
ব্যবহার করা উচিত wanted_keys
, তবে অন্যথায় ভাল দেখাচ্ছে looks
dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))
করি:, এটি {'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}
উদ্দেশ্য হিসাবে ফিরে আসে ।
dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}
এবং ফলাফলটি হয়েছিল {}
, যা আমি একটি ফাঁকা ডিক হিসাবে ধরে নিয়েছিলাম।
foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))
আমি পেয়েছি: {'0': [1, 3], '2': [1, 4]}
যা উদ্দেশ্য ফলাফল
আপনার আসল অভিধান orig
এবং আপনার আগ্রহী প্রবেশের সেট দেওয়া keys
:
filtered = dict(zip(keys, [orig[k] for k in keys]))
যা দেলানানের উত্তরের মতো সুন্দর নয়, তবে প্রতিটি পাইথন সংস্করণের আগ্রহের কাজ করা উচিত। এটি keys
আপনার মূল অভিধানে বিদ্যমান প্রতিটি উপাদানকে ভঙ্গুর করে তোলে ।
দেলানান কর্তৃক গৃহীত উত্তরের ভিত্তিতে।
যদি আপনার একটি চাওয়া চাবি পুরানো_ডিকেটে না থাকে? ডেলানান সলিউশনটি আপনি ধরতে পারেন এমন কী-ইরর ব্যতিক্রম নিক্ষেপ করবে। আপনার যদি এটি প্রয়োজন না হয় তবে আপনি চান:
কেবলমাত্র এমন কীগুলি অন্তর্ভুক্ত করুন যা পুরাতন_দিক্ট এবং আপনার পছন্দসই_কিজের সেট উভয়ই উপস্থিত থাকে।
old_dict = {'name':"Foobar", 'baz':42}
wanted_keys = ['name', 'age']
new_dict = {k: old_dict[k] for k in set(wanted_keys) & set(old_dict.keys())}
>>> new_dict
{'name': 'Foobar'}
পুরানো_ডিক্টে সেট না থাকা কীগুলির জন্য একটি ডিফল্ট মান রয়েছে।
default = None
new_dict = {k: old_dict[k] if k in old_dict else default for k in wanted_keys}
>>> new_dict
{'age': None, 'name': 'Foobar'}
{k: old_dict.get(k, default) for k in ...}
এই ফাংশনটি কৌশলটি করবে:
def include_keys(dictionary, keys):
"""Filters a dict by only including certain keys."""
key_set = set(keys) & set(dictionary.keys())
return {key: dictionary[key] for key in key_set}
ডেলাননের সংস্করণটির মতোই এটিও অভিধান বোঝা ব্যবহার করে এবং বড় অভিধানগুলির জন্য স্থিতিশীল পারফরম্যান্স থাকে (কেবলমাত্র আপনি অনুমোদিত কীগুলির সংখ্যার উপর নির্ভরশীল, অভিধানের কীগুলির মোট সংখ্যা নয়)।
এবং ঠিক মাইগান এর সংস্করণের মতোই এটির সাহায্যে আপনার কীগুলির তালিকাটি কীগুলিতে অন্তর্ভুক্ত থাকতে পারে যা অভিধানে বিদ্যমান নেই।
এবং বোনাস হিসাবে, এখানে বিপরীতটি রয়েছে, যেখানে আপনি মূল কয়েকটি কী বাদ দিয়ে একটি অভিধান তৈরি করতে পারেন:
def exclude_keys(dictionary, keys):
"""Filters a dict by excluding certain keys."""
key_set = set(dictionary.keys()) - set(keys)
return {key: dictionary[key] for key in key_set}
মনে রাখবেন যে ডেলানানের সংস্করণটির বিপরীতে, অপারেশনটি স্থানে করা হয় না, তাই পারফরম্যান্স অভিধানের কী সংখ্যার সাথে সম্পর্কিত। যাইহোক, এর সুবিধাটি হ'ল ফাংশনটি প্রদত্ত অভিধানটি সংশোধন করবে না।
সম্পাদনা: ডিক থেকে কিছু কী বাদ না দেওয়ার জন্য একটি পৃথক ফাংশন যুক্ত করা হয়েছে।
invert
যে পরোক্ষভাবে keys
যুক্তি রাখা হয়, বা যে keys
যুক্তি প্রত্যাখ্যাত?", তাদের কত সম্মত হবে?
আমরা যদি নির্বাচিত কীগুলি মুছে দিয়ে একটি নতুন অভিধান করতে চাই, আমরা অভিধান বোঝার ব্যবহার করতে পারি
উদাহরণস্বরূপ:
d = {
'a' : 1,
'b' : 2,
'c' : 3
}
x = {key:d[key] for key in d.keys() - {'c', 'e'}} # Python 3
y = {key:d[key] for key in set(d.keys()) - {'c', 'e'}} # Python 2.*
# x is {'a': 1, 'b': 2}
# y is {'a': 1, 'b': 2}
অন্য বিকল্প:
content = dict(k1='foo', k2='nope', k3='bar')
selection = ['k1', 'k3']
filtered = filter(lambda i: i[0] in selection, content.items())
তবে আপনি একটি list
(পাইথন 2) বা একটি পুনরুদ্ধারকারী (পাইথন 3) পেয়েছেন filter()
, এটি নয় dict
।
filtered
মধ্যে dict
এবং আপনার অভিধান ফিরে পেতে!
del
একটি লাইনারে ব্যবহার করে এখানে আরও একটি সহজ পদ্ধতি :
for key in e_keys: del your_dict[key]
e_keys
বাদ দেওয়া হবে কীগুলির তালিকা। এটি আপনাকে নতুন দেওয়ার পরিবর্তে আপনার ডিককে আপডেট করবে।
যদি আপনি একটি নতুন আউটপুট ডিক চান, তবে মুছে ফেলার আগে ডকের একটি অনুলিপি তৈরি করুন:
new_dict = your_dict.copy() #Making copy of dict
for key in e_keys: del new_dict[key]
আপনি ব্যবহার করতে পারেন python-benedict
, এটি একটি ডিক সাবক্লাস।
স্থাপন: pip install python-benedict
from benedict import benedict
dict_you_want = benedict(your_dict).subset(keys=['firstname', 'lastname', 'email'])
এটি গিটহাবের ওপেন সোর্স: https://github.com/fabiocaccamo/python-benedict
দাবি অস্বীকার: আমি এই গ্রন্থাগারের লেখক।