আমি এরকম কিছু করতে চাই:
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
'Foo' এবং 'বার' উভয়ই ডিক ফো-তে আছে কিনা তা আমি কীভাবে পরীক্ষা করব?
আমি এরকম কিছু করতে চাই:
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
'Foo' এবং 'বার' উভয়ই ডিক ফো-তে আছে কিনা তা আমি কীভাবে পরীক্ষা করব?
উত্তর:
ঠিক আছে, আপনি এটি করতে পারেন:
>>> if all (k in foo for k in ("foo","bar")):
... print "They're there!"
...
They're there!
set
উচ্চতর। যথারীতি ... এটি পরিমাপ করুন! -)
if {"foo", "bar"} <= myDict.keys(): ...
আপনি যদি এখনও পাইথন 2 এ থাকেন তবে আপনি এটি করতে পারেন
if {"foo", "bar"} <= myDict.viewkeys(): ...
আপনি যদি এখনও সত্যিই একটি পুরানো পাইথন <= 2.6 set
তে থাকেন তবে ডিকটি কল করতে পারেন , তবে সেটটি তৈরি করতে পুরো ডিকটিটি পুনরাবৃত্তি করবে এবং এটি ধীর গতিতে:
if set(("foo", "bar")) <= set(myDict): ...
set(("foo","bar")) <= myDict.keys()
যা অস্থায়ী সেটটিকে এড়িয়ে চলে, তাই অনেক দ্রুত। আমার পরীক্ষার জন্য কোয়েরিটি 10 আইটেম ছিল তখন সমস্ত ব্যবহার করার মতোই গতি সম্পর্কে। যদিও কোয়েরিটি বড় হওয়ার সাথে সাথে এটি ধীর হয়ে যায়।
if {'foo', 'bar'} <= set(myDict): ...
ডি এবং কিউ এর জন্য আপনার নিজস্ব মান রাখুন
>>> from timeit import Timer
>>> setup='''from random import randint as R;d=dict((str(R(0,1000000)),R(0,1000000)) for i in range(D));q=dict((str(R(0,1000000)),R(0,1000000)) for i in range(Q));print("looking for %s items in %s"%(len(q),len(d)))'''
>>> Timer('set(q) <= set(d)','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632499
0.28672504425048828
#This one only works for Python3
>>> Timer('set(q) <= d.keys()','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632084
2.5987625122070312e-05
>>> Timer('all(k in d for k in q)','D=1000000;Q=100;'+setup).timeit(1)
looking for 100 items in 632219
1.1920928955078125e-05
d.viewkeys()
করতে হবে set(q) <= d.viewkeys()
।
Python 2.7.5
d.keys()
পদ্ধতিও আছে
set(q) <= ...
TypeError: can only compare to a set
। দুঃখিত! :))
d.viewkeys() >= set(q)
। অর্ডার কেন গুরুত্ব দেয় তা জানার চেষ্টা করে এখানে এসেছি!
আপনাকে কোনও বাম দিকে কোনও সেট মুড়ে রাখতে হবে না। আপনি কেবল এটি করতে পারেন:
if {'foo', 'bar'} <= set(some_dict):
pass
এটি all(k in d...)
সমাধানের চেয়ে আরও ভাল পারফর্ম করে ।
সেট ব্যবহার :
if set(("foo", "bar")).issubset(foo):
#do stuff
বিকল্পভাবে:
if set(("foo", "bar")) <= set(foo):
#do stuff
set(d)
একই set(d.keys())
( যেমনটি অন্তর্বর্তী তালিকা d.keys()
তৈরি করে না)
এটি সম্পর্কে:
if all([key in foo for key in ["foo","bar"]]):
# do stuff
pass
all
।
আমি মনে করি এটি বুদ্ধিমান এবং পাইথোনিক।
{'key1','key2'} <= my_dict.keys()
যদিও আমি অ্যালেক্স মার্তেলির উত্তরটি পছন্দ করি, এটি আমার কাছে পাইথোনিক বলে মনে হয় না। অর্থাৎ, আমি ভেবেছিলাম পাইথোনিক হওয়ার একটি গুরুত্বপূর্ণ অংশটি সহজেই বোধগম্য। এই লক্ষ্য সঙ্গে, <=
বুঝতে সহজ নয়।
এটি আরও চরিত্রগুলি থাকা issubset()
সত্ত্বেও কার্ল ভয়েগল্যান্ডের উত্তর অনুসারে ব্যবহার করা আরও বোধগম্য। যেহেতু সেই পদ্ধতিটি অভিধান হিসাবে একটি যুক্তি হিসাবে ব্যবহার করতে পারে, একটি সংক্ষিপ্ত, বোধগম্য সমাধান হ'ল:
foo = {'foo': 1, 'zip': 2, 'zam': 3, 'bar': 4}
if set(('foo', 'bar')).issubset(foo):
#do stuff
আমি {'foo', 'bar'}
এর জায়গায় ব্যবহার করতে চাই set(('foo', 'bar'))
, কারণ এটি খাটো। তবে এটি ততটা বোধগম্য নয় এবং আমি মনে করি বন্ধনীগুলি অভিধান হিসাবে খুব সহজেই বিভ্রান্ত হয়।
.issubset()
। আমি মনে করি পাইথন ডকুমেন্টেশনে থাকার ফলে এটি ডিফল্টরূপে পাইথোনিক হয়।
অ্যালেক্স মার্তেলির সমাধানটি set(queries) <= set(my_dict)
সবচেয়ে সংক্ষিপ্ত কোড তবে খুব দ্রুততম নাও হতে পারে। ধরে নিন কিউ = লেন (ক্যোয়ারী) এবং ডি = লেন (আমার_ডিক্ট)।
দুটি সেট তৈরি করতে এটি ও (কিউ) + ও (ডি) লাগে, এবং তারপরে (এক আশা!) কেবলমাত্র ও (মিনিট (কিউ, ডি)) সাবসেট পরীক্ষা করতে হবে - অবশ্যই ধরে নেওয়া যায় যে পাইথন সেট লুক আপ করেছে ও (1) - এটি সবচেয়ে খারাপ ক্ষেত্রে (যখন উত্তরটি সত্য হয়)।
হিউডব্রাউন (এট আল?) এর জেনারেটর সলিউশনটি all(k in my_dict for k in queries)
সবচেয়ে খারাপ ক্ষেত্রে (ও ) is
জটিল বিষয়গুলি:
(1) সেট-ভিত্তিক গ্যাজেটের লুপগুলি সি-স্পিডে সম্পন্ন হয় যেখানে যে কোনও-ভিত্তিক গ্যাজেটটি বাইটকোডের উপরে লুপ করে চলেছে।
(২) যে কোনও-ভিত্তিক গ্যাজেটের কলকারী কোয়েরি আইটেমগুলি অর্ডার করতে ব্যর্থতার সম্ভাবনার কোনও জ্ঞান সেই অনুযায়ী ব্যবহার করতে সক্ষম হতে পারে যখন সেট-ভিত্তিক গ্যাজেট এ জাতীয় কোনও নিয়ন্ত্রণের অনুমতি দেয় না।
বরাবরের মতো, যদি গতি গুরুত্বপূর্ণ, অপারেশনাল অবস্থার অধীনে বেঞ্চমার্কিং একটি ভাল ধারণা।
আপনি ব্যবহার করতে পারেন ) .issubset ( পাশাপাশি
>>> {"key1", "key2"}.issubset({"key1":1, "key2":2, "key3": 3})
True
>>> {"key4", "key2"}.issubset({"key1":1, "key2":2, "key3": 3})
False
>>>
ল্যাম্বদা ব্যবহার সম্পর্কে কীভাবে?
if reduce( (lambda x, y: x and foo.has_key(y) ), [ True, "foo", "bar"] ): # do stuff
আপনি যদি চান:
তারপর:
from operator import itemgetter
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
keys = ("foo","bar")
getter = itemgetter(*keys) # returns all values
try:
values = getter(foo)
except KeyError:
# not both keys exist
pass
এটি এমনটি নয় যা আপনি ভাবেননি, তবে আমি দেখতে পাচ্ছি যে সবচেয়ে সহজ জিনিসটি সাধারণত সেরা:
if ("foo" in foo) and ("bar" in foo):
# do stuff
>>> if 'foo' in foo and 'bar' in foo:
... print 'yes'
...
yes
জেসন, () পাইথনে প্রয়োজনীয় নয়।
কেবল আমার এটি গ্রহণ করুন, দুটি পদ্ধতি রয়েছে যা প্রদত্ত সমস্ত বিকল্পগুলি বোঝা সহজ। সুতরাং আমার প্রধান মানদণ্ডে খুব পঠনযোগ্য কোড রয়েছে, ব্যতিক্রমীভাবে দ্রুত কোড নয়। কোডটি বোধগম্য রাখতে, আমি প্রদত্ত সম্ভাবনাগুলিকে পছন্দ করি:
"Var <= var2.keys ()" নীচে আমার পরীক্ষায় দ্রুত সম্পাদন করে, আমি এটিকে পছন্দ করি।
import timeit
timeit.timeit('var <= var2.keys()', setup='var={"managed_ip", "hostname", "fqdn"}; var2= {"zone": "test-domain1.var23.com", "hostname": "bakje", "api_client_ip": "127.0.0.1", "request_data": "", "request_method": "GET", "request_url": "hvar2p://127.0.0.1:5000/test-domain1.var23.com/bakje", "utc_datetime": "04-Apr-2019 07:01:10", "fqdn": "bakje.test-domain1.var23.com"}; var={"managed_ip", "hostname", "fqdn"}')
0.1745898080000643
timeit.timeit('var.issubset(var2)', setup='var={"managed_ip", "hostname", "fqdn"}; var2= {"zone": "test-domain1.var23.com", "hostname": "bakje", "api_client_ip": "127.0.0.1", "request_data": "", "request_method": "GET", "request_url": "hvar2p://127.0.0.1:5000/test-domain1.var23.com/bakje", "utc_datetime": "04-Apr-2019 07:01:10", "fqdn": "bakje.test-domain1.var23.com"}; var={"managed_ip", "hostname", "fqdn"};')
0.2644960229999924
কেবল কয়েকটি কী কী মেলে কিনা তা নির্ধারণের ক্ষেত্রে এটি কাজ করে:
any_keys_i_seek = ["key1", "key2", "key3"]
if set(my_dict).intersection(any_keys_i_seek):
# code_here
pass
কেবলমাত্র কিছু কী মিলছে কিনা তা খুঁজে পাওয়ার জন্য আরও একটি বিকল্প:
any_keys_i_seek = ["key1", "key2", "key3"]
if any_keys_i_seek & my_dict.keys():
# code_here
pass
সমস্ত কীগুলি ডিকটিতে রয়েছে কিনা তা সনাক্ত করার জন্য অন্য একটি বিকল্প:
dict_to_test = { ... } # dict
keys_sought = { "key_sought_1", "key_sought_2", "key_sought_3" } # set
if keys_sought & dict_to_test.keys() == keys_sought:
# yes -- dict_to_test contains all keys in keys_sought
# code_here
pass
>>> ok
{'five': '5', 'two': '2', 'one': '1'}
>>> if ('two' and 'one' and 'five') in ok:
... print "cool"
...
cool
এটি কাজ করে বলে মনে হচ্ছে
()
যে প্রথমে মূল্যায়ন করা হবে এবং এর ফলাফল True
হবে, যা কিনা পরে তা পরীক্ষা করে দেখবে True in ok
। এটি আসলে কীভাবে কাজ করে ?!