'ডিক' অবজেক্টের কোনও 'গুণমান' নেই


113

পাইথনে কোনও গ্রাফ ট্র্যাভার করার সময়, আমি এই ত্রুটিটি পেয়েছি:

'ডিক' অবজেক্টের কোনও 'গুণমান' নেই

আমার কোডটি এখানে:

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

কোডটির লক্ষ্য একটি নোড থেকে অন্যের কাছে পাথগুলি সন্ধান করা। কোড উত্সঃ

আমি কেন এই ত্রুটি পাচ্ছি এবং আমি কীভাবে এটি ঠিক করতে পারি?


4
if not start in graph:
পিটার উড

উত্তর:


189

has_keyপাইথন 3 এ সরানো হয়েছে ডকুমেন্টেশন থেকে :

  • সরানো হয়েছে dict.has_key()- inপরিবর্তে অপারেটরটি ব্যবহার করুন।

এখানে একটি উদাহরণ:

if start not in graph:
    return None

4
আমি মনে করি key not in d.keys()সম্ভবত খুব ধীরও, যেহেতু key not in dও (1) অনুসন্ধান করা উচিত এবং আমি বিশ্বাস করি যে keysএকটি তালিকা তৈরি করে, যা হে (এন) লুচিং (স্মৃতিতে অতিরিক্ত স্থান নেওয়ার কথা উল্লেখ না করা)। যদিও আমি এটি সম্পর্কে ভুল হতে পারি - এটি এখনও হ্যাশ লুকিং হতে পারে
অ্যাডাম স্মিথ

4
@ অ্যাডামস্মিথ পাইথন 3 এ নেই, d.keys()এটি একটি দৃশ্য যা বেশিরভাগ সেট ইন্টারফেস প্রয়োগ করে।
এন্টি হাপালা

4
এটি সরানো হয়েছে ... তবে কেন? যেহেতু এটি পাইথন 2 বন্দর থেকে পাইথন 3 আরও কাজ করতে।
ফল 15 ই

4
@ 林果 皞: একটি নতুন প্রধান সংস্করণের পুরো বিষয়টি হ'ল বিকাশকারীরা উন্নতিগুলি প্রবর্তন করতে পারেন যার মধ্যে ভাষা পরিপক্ক হওয়ার সাথে সাথে পুরানো বৈশিষ্ট্যগুলিকে সমর্থন করার পরিবর্তে ভঙ্গ পরিবর্তনগুলি অন্তর্ভুক্ত থাকতে পারে। এটি সর্বদা একটি ঝুঁকি যা একটি নতুন বড় সংস্করণে আপগ্রেড করার আগে অবশ্যই বিবেচনা করা উচিত। এই ক্ষেত্রে, inসংক্ষিপ্ত এবং আরও পাইথোনিক, পাশাপাশি ভাষার অন্যান্য সংকলনের সাথে সামঞ্জস্যপূর্ণ।
johnnyRose

23

has_key পাইথন ৩.০ এ অবমুক্ত করা হয়েছে । বিকল্পভাবে আপনি 'ইন' ব্যবহার করতে পারেন

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

print('A' in graph)
>> True

print('E' in graph)
>> False

20

পাইথন 3 has_key(key)এ প্রতিস্থাপন করা হয়__contains__(key)

পাইথন ৩..7 পরীক্ষিত:

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

5

আমি মনে করি এটি inকী হিসাবে ইতিমধ্যে বিদ্যমান রয়েছে কিনা তা নির্ধারণ করার সময় এটি কেবল "আরও অজগর" হিসাবে বিবেচিত হবে

if start not in graph:
    return None

পাইথনের জেন (পিইপি 20) এর মতে আমি নিশ্চিত নই: "অন্তর্নিহিতের চেয়ে সুস্পষ্ট ভাল" is আমি মনে করি আপনি inকীওয়ার্ডটি ব্যবহার করলে আপনার উদ্দেশ্যটি কী if start not in graph:বোঝায় তা যথেষ্ট পরিষ্কার হতে পারে না ? graphতালিকা হতে পারে এবং তালিকায় তালিকার কোনও স্ট্রিং নেই কিনা তা যাচাই করে? অন্যদিকে, আপনি যদি সিনট্যাক্স ব্যবহার করেন has_key( যেমন in graph.keys()graphdict
অবনতিযুক্ত

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

এটি লেখার পরে নথিটি সংরক্ষণ করুন এবং এফ 5 টিপুন

এর পরে, পাইথন আইডিএল শেলটিতে আপনি যে কোডটি চালাবেন তা হ'ল:

সন্ধান_পথ (গ্রাফ, 'এ', 'ডি')

IDLE তে আপনার যে উত্তরটি পাওয়া উচিত তা হ'ল

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

আপনি দয়া করে এটি ব্যাখ্যা করতে পারেন? বিশেষত পুনরাবৃত্তি অংশ।
এনসিফার

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