पायथन की जाँच करें कि क्या चाबियों की सूची शब्दकोश में मौजूद है


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

महान! यदि स्थिति गलत है तो तत्वों को डायक से गायब करने का कोई शॉर्टकट तरीका है?
— प्रतिद्वंद्वी

2
@guival यूप, आप सेट ऑपरेशंस का उपयोग कर सकते हैं, जैसे set(students) - grades.keys()कि पायथन 3 में
— स्वेन मार्नाच

क्या यह जांचने का कोई तरीका है कि क्या चाबियों की सूची में से कोई एक स्ट्रिंग में उप स्ट्रिंग है?
— जोनाथन

@ जोनाथन को यकीन नहीं है कि आपका क्या मतलब है, हो सकता है any(k in my_string for k in keys)?
— स्वेन मार्नाच

@SvenMarnach ने अभी कोई खोज की है ()! ठीक वैसा ही मैं देख रहा था :)
— योनातन

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()। यह हमेशा O (m + n) होगा, जहाँ m और n संबंधित आकार namesऔर हैं grades। उपयोग करना all()ओ (एम) होगा, और शॉर्ट-कट हो सकता है।
— स्वेन मार्नाच

7
@SvenMarnach अधिकार, मैं इसे यहाँ छोड़ दूँगा क्योंकि यह एक और दृष्टिकोण है लेकिन मैं मानता हूँ कि तुम्हारा सबसे अच्छा है।
— जामिलाक

निश्चित रूप से इसे यहाँ छोड़ दो! यह किसी भी मामले में एक दिलचस्प दृष्टिकोण है।
— स्वेन मार्नाच

3

छात्रों को सेट के रूप में मानते हुए

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

यदि इसे सेट करने के लिए परिवर्तित न करें

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

0

यदि चाबियों का एक नंबर लाभ यह है कि लेने के द्वारा एक dict में हैं परीक्षण कर सकते हैं <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():
    ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.