मेरे पास यह कोड यहां है:

def most_popular_book(book_loans):
    vBL = book_loans.values()
    kBL = book_loans.keys()
    items = book_loans.items()
    print items
    kBL = sorted(kBL, key=str.lower)
    mvBL = max(vBL)
    for key,vaule in items:
        if vaule == mvBL:
            return key

इस कोड के साथ मेरा लक्ष्य कुंजी को सबसे बड़े मूल्य के साथ प्राप्त करना है, और यदि 2 चाबियों के समान मान हैं तो एक को चुनें जो लेक्सोग्राफी क्रम में पहले आता है।

अब कोड का पहला भाग ठीक काम करता है! हालाँकि मुझे दूसरे भाग में परेशानी हो रही है। मैंने इस विषय पर कुछ कोड पढ़ा लेकिन मैं इसे काम करने का कोई तरीका नहीं ढूंढ पाया।

कोड कैसे काम करना चाहिए, इसके लिए उदाहरण:

print most_popular_book({'harry potter':['yossi','adam'], 
'lilo and stich':['yossi', "adam"], 'catch-22':['adam'] })

'harry potter'

(इसे हैरी पॉटर प्रिंट करना चाहिए) लेकिन मेरा कोड 'lilo and stich' . प्रिंट करता है

दूसरा उदाहरण:

{'the little prince': ['yossi'], 'harry potter': ['yossi', 'assaf'], 
 'catch-22': ['yossi', 'dana']}

'catch-22'

(यह आउटपुट सही ढंग से काम कर रहा है)

2
Heba Masarwa 28 नवम्बर 2018, 23:16

2 जवाब

सबसे बढ़िया उत्तर

आप पूरी तरह से क्रमबद्ध सूची प्राप्त कर सकते हैं:

fancy = sorted( book_loans.items(), key = lambda x:(-len(x[1]), x[0]))

और पहला ले लो।

यह एक tuple को सॉर्ट-मानदंड के रूप में परिभाषित करके काम करता है - tuples को पहले मान से क्रमबद्ध किया जाता है, फिर दूसरा मान यदि पहला मान ड्रॉ आदि होता है।

-len() के आधार पर छांटने से यह "इनवर्ट" हो जाता है (आप reverse=True परम को सॉर्ट करने के लिए भी निर्दिष्ट कर सकते हैं - या तो एक काम करता है।

fancy = sorted( {'harry potter':['yossi','adam'], 'lilo and stich':['yossi', "adam"],
                 'catch-22':['adam'] }.items(), key = lambda x:(-len(x[1]), x[0])) 

print(fancy)
print(fancy[0][0])

आउटपुट:

[('harry potter', ['yossi', 'adam']), ('lilo and stich', ['yossi', 'adam']),
 ('catch-22', ['adam'])]

harry potter
3
Patrick Artner 28 नवम्बर 2018, 23:24

आप min का उपयोग कर सकते हैं यदि आप केवल सबसे लोकप्रिय किताब:

def most_popular_book(books):
    result, _ = min(books.items(), key=lambda x: (-len(x[1]), x[0]))
    return result


print(most_popular_book({'harry potter': ['yossi', 'adam'],
                         'lilo and stich': ['yossi', "adam"], 'catch-22': ['adam']}))
print(most_popular_book({'the little prince': ['yossi'], 'harry potter': ['yossi', 'assaf'],
                         'catch-22': ['yossi', 'dana']}))

आउटपुट

harry potter
catch-22

विचार वही है जो @PatrickArtner के उत्तर में है, केवल अंतर को क्रमबद्ध किया जा रहा है O(nlogn) और न्यूनतम O(n) है। सूची को क्रमबद्ध करने की आवश्यकता नहीं है, केवल न्यूनतम खोजने के लिए।

1
Dani Mesejo 28 नवम्बर 2018, 23:40