'तानाशाह' वस्तु में कोई विशेषता नहीं है 'has_key'


105

पायथन में एक ग्राफ को पार करते समय, मैं यह त्रुटि प्राप्त कर रहा हूं:

'तानाशाह' वस्तु में कोई विशेषता नहीं है 'has_key'

यहाँ मेरा कोड है:

def find_path(graph, start, end, path=[]):
    path = path + [start]
    if start == end:
        return path
    if not graph.has_key(start):
        return None
    for node in graph[start]:
        if node not in path:
            newpath = find_path(graph, node, end, path)
            if newpath: return newpath
    return None

कोड का उद्देश्य एक नोड से दूसरे तक के रास्तों को खोजना है। कोड स्रोत: http://cs.mwsu.edu/~terry/courses/4883/lectures/graphs.html

मुझे यह त्रुटि क्यों हो रही है और मैं इसे कैसे ठीक कर सकता हूं?


2
if not start in graph:
पीटर वुड

जवाबों:


180

has_keyअजगर 3 में हटा दिया गया था। प्रलेखन से :

  • हटाए गए dict.has_key()- inइसके बजाय ऑपरेटर का उपयोग करें ।

यहाँ एक उदाहरण है:

if start not in graph:
    return None

1
मुझे लगता key not in d.keys()है कि शायद बहुत धीमी है, भी, क्योंकि key not in dओ (1) लुकअप होना चाहिए और मेरा मानना ​​है कि keysएक सूची है, जो ओ (एन) लुकअप है (मेमोरी में अतिरिक्त जगह नहीं लेने का उल्लेख है)। मैं इस बारे में गलत हो सकता है - यह अभी भी हैश लुकअप हो सकता है
एडम स्मिथ

3
@AdamSmith पायथन 3 में नहीं, d.keys()एक ऐसा दृश्य है जो अधिकांश सेट इंटरफ़ेस को लागू करता है।
अंती हापाला

3
इसे हटा दिया ... लेकिन क्यों? चूंकि यह अजगर 2 पोर्ट को अजगर 3 और अधिक काम करने के लिए बनाता है।
फल

1
@ @ Version: एक नए प्रमुख संस्करण की पूरी बात यह है कि डेवलपर्स सुधार ला सकते हैं जिसमें भाषा की परिपक्वता के रूप में पुरानी विशेषताओं का समर्थन करने के बजाय ब्रेकिंग परिवर्तन शामिल हो सकते हैं। यह हमेशा एक जोखिम होता है जिसे नए प्रमुख संस्करण में अपग्रेड करने से पहले विचार किया जाना चाहिए। इस मामले में, inछोटी और अधिक पायथोनिक है, साथ ही साथ भाषा में अन्य संग्रह के अनुरूप है।
johnnyRose

23

has_key को Python 3.0 में चित्रित किया गया है । वैकल्पिक रूप से आप 'इन' का उपयोग कर सकते हैं

graph={'A':['B','C'],
   'B':['C','D']}

print('A' in graph)
>> True

print('E' in graph)
>> False

17

अजगर 3 में, has_key(key)द्वारा प्रतिस्थापित किया जाता है__contains__(key)

अजगर 3.7 में परीक्षण किया गया:

a = {'a':1, 'b':2, 'c':3}
print(a.__contains__('a'))

5

मुझे लगता है कि यह "अधिक पायथोनिक" माना जाता है कि यह inनिर्धारित करने के लिए कि क्या एक कुंजी पहले से मौजूद है, जैसा कि उपयोग करना है

if start not in graph:
    return None

मुझे यकीन नहीं है, द ज़ेन ऑफ पायथन (पीईपी 20) के अनुसार: "स्पष्ट है निहित से बेहतर है"। मुझे लगता है कि यदि आप inकीवर्ड का उपयोग करते हैं , तो आपका इरादा पर्याप्त रूप से स्पष्ट नहीं हो सकता है कि if start not in graph:इसका क्या मतलब है? graphएक सूची हो सकती है और यह जाँचती है कि क्या सूची में ऐसा कोई तार नहीं है? दूसरी ओर, यदि आप वाक्यविन्यास का उपयोग करते हैं जैसे has_key(अब पदावनत) या कम से कम in graph.keys()यह अधिक स्पष्ट है कि graphएक हैdict
अमिताय ड्रमर

4

दस्तावेज़ में पूरा कोड होगा:

graph = {'A': ['B', 'C'],
             'B': ['C', 'D'],
             'C': ['D'],
             'D': ['C'],
             'E': ['F'],
             'F': ['C']}
def find_path(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return path
        if start not in graph:
            return None
        for node in graph[start]:
            if node not in path:
                newpath = find_path(graph, node, end, path)
                if newpath: return newpath
        return None

इसे लिखने के बाद, दस्तावेज़ को सहेजें और F 5 दबाएं

उसके बाद, आप पायथन आईडीएल शेल में जो कोड चलाएंगे, वह होगा:

find_path (ग्राफ़, 'ए', 'डी')

आईडीएलई में आपको जो जवाब मिलना चाहिए, वह है

['A', 'B', 'C', 'D'] 

क्या आप इसे स्पष्ट कर सकते हैं? विशेष रूप से रिकर्सन भाग।
एनिलशर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.