অভিধানে কীগুলির তালিকা উপস্থিত রয়েছে কিনা তা পাইথন পরীক্ষা করে দেখুন


91

আমার কাছে এমন একটি অভিধান রয়েছে যা দেখতে দেখতে:

grades = {
        'alex' : 11,
        'bob'  : 10,
        'john' : 14,
        'peter': 7
       }

এবং নামের একটি তালিকা students = ('alex', 'john')

আমার যাচাই করা দরকার যে সমস্ত নামই ডিকের studentsকী হিসাবে উপস্থিত রয়েছে grades

gradesআরও বেশি নাম studentsথাকতে পারে তবে সমস্ত নাম থাকা উচিতgrades

এটি করার সহজ সরল উপায় থাকতে হবে তবে আমি এখনও অজগর থেকে নতুন এবং এটি বের করতে পারি না। চেষ্টা করেছেন if students in grades, কাজ করেননি।

প্রকৃত ক্ষেত্রে তালিকাগুলি আরও বড় হবে।


উত্তর:


202

ব্যবহার all():

if all(name in grades for name in students):
    # whatever

দুর্দান্ত! শর্তটি মিথ্যা হলে ডিিক থেকে নিখোঁজ থাকা উপাদানগুলি পাওয়ার কোনও শর্টকাট উপায়?
সাহসী

4
@guival হ্যাঁ, আপনি সেট অপারেশন, যেমন ব্যবহার করতে পারেন set(students) - grades.keys()পাইথন 3
সেভেন Marnach

কীগুলির তালিকাগুলির কোনওটি একটি স্ট্রিংয়ের উপ-স্ট্রিং কিনা তা পরীক্ষা করার কোনও উপায় আছে?
জোনাথন

@ জোনাথন নিশ্চিত না যে আপনি কী বোঝাতে চেয়েছেন, সম্ভবত any(k in my_string for k in keys)?
সোভেন মারনাচ

@ স্যাভেনমার্নাচ সবেমাত্র আবিষ্কার করেছেন ()! ঠিক আমি যা খুঁজছিলাম :)
জোনাথন

24
>>> grades = {
        'alex' : 11,
        'bob'  : 10,
        'john' : 14,
        'peter': 7
}
>>> names = ('alex', 'john')
>>> set(names).issubset(grades)
True
>>> names = ('ben', 'tom')
>>> set(names).issubset(grades)
False

এটি কল classকরা অবৈধ তাই আমি এটিকে পরিবর্তন করেছি names


বিপরীতে এটি শর্ট-কাট করতে পারে না all()। এটা সবসময় হতে হবে হে (মি + N), যেখানে মি এবং n এর নিজ নিজ মাপ হয় namesএবং grades। ব্যবহার all()ও (এম) হবে এবং শর্ট-কাট হতে পারে।
সোভেন মারনাচ

7
@ স্পেনমার্নাচ রাইট, আমি এটিকে এখানে ছেড়ে যাব কারণ এটি অন্য পদ্ধতির তবে আমি সম্মত হই যে আপনারাই সেরা।
জামিলাক

অবশ্যই এখানে ছেড়ে দিন! এটি যে কোনও ক্ষেত্রে একটি আকর্ষণীয় পদ্ধতির।
সোভেন মারনাচ

3

ছাত্র হিসাবে সেট হিসাবে ধরে নেওয়া

if not (students - grades.keys()):
    print("All keys exist")

সেট এ রূপান্তর না হলে

if not (set(students) - grades.keys()):
    print("All keys exist")

0

আপনি যদি পরীক্ষা করে দেখতে পারেন যে কয়েকটি কী কী ডিকের সাথে রয়েছে এমন সুবিধা গ্রহণ করে যে <dict>.keys()একটি প্রদান করে set

কোডটিতে এই যুক্তি ...

if 'foo' in d and 'bar' in d and 'baz' in d:
    do_something()

আরও সংক্ষেপে উপস্থাপন করা যেতে পারে:

if {'foo', 'bar', 'baz'} <= d.keys():
    do_something()

<=কিনা বাম সেট সেট পরীক্ষার জন্য অপারেটর ডান দিকে সেট একটি উপসেট নয়। এটি লেখার আর একটি উপায় হবে <set>.issubset(other)

সেটগুলি দ্বারা সমর্থিত আরও আকর্ষণীয় অপারেশন রয়েছে: https://docs.python.org/3.8/library/stdtypes.html#set

এই কৌশলটি ব্যবহার করে কোডের অনেকগুলি জায়গা ঘনীভূত করতে পারে যা উপরের প্রথম উদাহরণে দেখানো হয়েছে যে কয়েকটি কী ব্যবহার করে।

কীগুলির সম্পূর্ণ তালিকাগুলি ব্যবহারের জন্যও পরীক্ষা করা যেতে পারে <=:

if set(students) <= grades.keys():
    print("All studends listed have grades in your class.")

# or using unpacking - which is actually faster than using set()
if {*students} <= grades.keys():
    ...

বা যদি studentsএকটি ডিক হয়:

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