पायथन सेट की समझ


81

इसलिए मुझे होमवर्क असाइनमेंट के लिए ये दो समस्याएं हैं और मैं दूसरे पर अटक गया हूं।

  1. उन सभी अभाज्य संख्याओं का एक सेट उत्पन्न करने के लिए एक पायथन सेट कॉम्प्रिहेंशन (पायथन के सेट बिल्डर नोटेशन के समतुल्य) का उपयोग करें। याद रखें कि एक अभाज्य संख्या एक पूर्णांक है जो 1 से अधिक है और किसी पूर्णांक के अलावा विभाज्य नहीं है। स्वयं और 1. अपने सेट के अपराधों को एक चर में स्टोर करें (आपको अतिरिक्त भागों के लिए इसकी आवश्यकता होगी)। अपने प्राइम्स ऑफ़ प्राइम्स (जैसे, प्रिंट फंक्शन के साथ) को आउटपुट करें।

  2. 100 से कम के प्राइम में शामिल प्राइम के सभी जोड़े में क्रमबद्ध जोड़े (लंबाई 2 के ट्यूपल्स) के एक सेट को उत्पन्न करने के लिए एक पायथन सेट कॉम्प्रिहेंशन का उपयोग करें। एक प्राइम पेयर लगातार विषम संख्याओं की एक जोड़ी है जो दोनों प्रमुख हैं। प्राइमरी पेयर के अपने सेट को एक वेरिएबल में स्टोर करें। नंबर 1 का आपका सेट बहुत मददगार होगा। अपने मुख्य जोड़े के सेट का उत्पादन करें।

पहले एक के लिए, यह पूरी तरह से काम करता है:

r= {x for x in range(2, 101) 
if not any(x % y == 0 for y in range(2, x))} 

हालांकि, मैं दूसरे पर बहुत स्टम्प्ड हूं। मुझे लगता है कि मुझे सेट आर के कार्टेशियन उत्पाद को किसी चीज़ के साथ लेना पड़ सकता है लेकिन मुझे यकीन नहीं है।

यह मुझे कुछ हद तक बंद कर देता है, लेकिन मुझे लगातार जोड़े चाहिए।

cart = { (x, y) for x in r for y in r
     if x < y }

जवाबों:


69
primes = {x for x in range(2, 101) if all(x%y for y in range(2, min(x, 11)))}

मैंने परीक्षण को थोड़ा सरल किया - if all(x%yइसके बजायif not any(not x%y

मैंने y की सीमा भी सीमित कर दी है; विभाजकों के लिए परीक्षण का कोई मतलब नहीं है> sqrt (x)। तो अधिकतम (x) == 100 का तात्पर्य है अधिकतम (y) == 10. x <= 10 के लिए, y को भी <x होना चाहिए।

pairs = {(x, x+2) for x in primes if x+2 in primes}

प्रिम्स के जोड़े उत्पन्न करने और उनका परीक्षण करने के बजाय, एक प्राप्त करें और देखें कि क्या संबंधित उच्च प्राइम मौजूद है।


14

आप सहायक कार्यों के रूप में उपयुक्त विधेयकों का निर्माण करके स्वच्छ और स्पष्ट समाधान प्राप्त कर सकते हैं। दूसरे शब्दों में, पायथन सेट-बिल्डर नोटेशन का उपयोग उसी तरह करें जैसे आप नियमित गणित सेट-नोटेशन के साथ उत्तर लिखेंगे।

सेट कॉम्प्रिहेंशन के पीछे पूरा विचार यह है कि हम उसी तरह से कोड लिखें और तर्क दें, जैसे हम गणित को हाथ से करते हैं।

हाथ में एक उपयुक्त विधेय के साथ, समस्या 1 सरल हो जाती है:

 low_primes = {x for x in range(1, 100) if is_prime(x)}

और समस्या 2 को सरल बनाता है:

 low_prime_pairs = {(x, x+2) for x in range(1,100,2) if is_prime(x) and is_prime(x+2)}

ध्यान दें कि यह कोड समस्या विनिर्देशन का सीधा अनुवाद कैसे है, "ए प्राइम पेयर लगातार विषम संख्याओं की एक जोड़ी है जो दोनों प्रमुख हैं।"

पीएस मैं आपको वास्तव में होमवर्क समस्या का जवाब देने के बिना सही समस्या निवारण तकनीक देने की कोशिश कर रहा हूं।


2
हालांकि समस्या 2 को परिणाम फ्रिम् समस्या 1 पर सिर्फ लूपिंग के लिए सरल बनाया जा सकता है, जैसा कि निर्देशों में संकेत दिया गया है।
5

5

आप इस तरह जोड़े उत्पन्न कर सकते हैं:

{(x, x + 2) for x in r if x + 2 in r}

फिर जो कुछ करना बाकी है, वह उन्हें प्रमुख बनाने के लिए एक शर्त प्राप्त करना है, जिसे आप पहले उदाहरण में कर चुके हैं।

इसे करने का एक अलग तरीका: (हालांकि primes के बड़े सेट के लिए धीमा)

{(x, y) for x in r for y in r if x + 2 == y}

3
मुझे यकीन नहीं है कि आपका बेहतर तरीका बेहतर क्यों है। ओपी के पास पहले से ही 100 से कम के अपराध हैं r, इसलिए {(x, x + 2) for x in r if x + 2 in r}पर्याप्त है।
DSM

2
and x % 2 == 1इसकी आवश्यकता नही है।
thefourtheye

2
तय किया, धन्यवाद, किसी कारण के लिए मैंने सोचा कि primes भी हो सकता है
icedtrees

2
किसी कारण के लिए, मैं नहीं देखता कि कौन से लापता हैं। मैं सेट ([29, 31), (59, 61), (5, 7), (71, 73), (41, 43), (3, 5), (17, 19), (11) १३)])। कौन से जोड़े गायब हैं? आपने पहले से ही r (प्राइम होने का) शर्त लागू कर दी है, इसलिए कोड ठीक होना चाहिए।
icedtrees

नहीं, तुम बिल्कुल सही हो। मैं इंप्रेशन (7,11) और (13,17) आदि के अंतर्गत था ... प्राइम जोड़े में शामिल थे क्योंकि वे तकनीकी रूप से "लगातार" प्राइम की सूची में थे। लेकिन अब मैं समझ गया हूं।
user3308790
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.