पायथन सेट्स द्वारा '+' को क्यों नहीं समझा जाता है?


90

मैं जानना चाहूंगा कि यह मान्य क्यों है:

set(range(10)) - set(range(5))

लेकिन यह मान्य नहीं है:

set(range(10)) + set(range(5))

क्या ऐसा इसलिए है क्योंकि '+' का मतलब चौराहा और मिलन दोनों हो सकता है?


3
|संघ का मतलब है। आप क्या पूछ रहे हो?
एस.लूट

13
ऐसा इसलिए है क्योंकि गुइडो ने चौराहे और संघ के लिए अलग-अलग ऑपरेटरों को चुना।
डेविड हेफर्नन

3
@ डेविड हेफर्नन, गुइडो आमतौर पर बिना किसी कारण के या कम से कम कुछ मार्गदर्शक सिद्धांत के बिना चीजें नहीं करते हैं - यही पायथन को इतना महान बनाता है।
मार्क रैनसम

1
@ मर्क ओह, मुझे पूरा यकीन है कि उन्होंने इसे एक अच्छे कारण के लिए किया है।
डेविड हेफर्नन

1
यदि केवल ~एक द्विआधारी ऑपरेटर थे, तो आप |+ संघ के लिए, और ~अंतर के लिए हो सकते हैं , जो बहुत अधिक संतुलित है।
मैट जॉइनर

जवाबों:


109

अजगर सेट +ऑपरेटर के लिए एक कार्यान्वयन नहीं है ।

आप |सेट संघ के लिए और &सेट चौराहे के लिए उपयोग कर सकते हैं ।

-सेट अंतर के रूप में क्रियान्वयन करते हैं । आप ^सममित सेट अंतर के लिए भी उपयोग कर सकते हैं (यानी, यह केवल एक सेट में दिखाई देने वाली वस्तुओं के साथ एक नया सेट लौटाएगा लेकिन दोनों सेटों में दिखाई नहीं देगा)।


2
धन्यवाद। मुझे पता नहीं था | तथा &।
badzil

99

पायथन ने इसका उपयोग |करने के बजाय चुना +क्योंकि सेट यूनियन एक अवधारणा है जो बूलियन डिसंक्शन से निकटता से संबंधित है; बिट वेक्टर (जो अजगर में बस int/ हैं long) इस ऑपरेशन को बूलियन मानों के अनुक्रम में परिभाषित करते हैं और इसे "बिटवाइज़" कहते हैं। वास्तव में यह ऑपरेशन सेट यूनियन के समान है कि बाइनरी पूर्णांकों को कभी-कभी "बिट सेट" भी कहा जाता है, जहां सेट में तत्वों को प्राकृतिक संख्या में लिया जाता है।

क्योंकि intपहले से ही सेट-जैसे ऑपरेटरों को परिभाषित करता है |, &और ^, नए setप्रकार के लिए समान इंटरफ़ेस का उपयोग करना स्वाभाविक था ।


7
मुझे लगता है कि यह उत्तर प्रश्न में "क्यों" को बेहतर तरीके से संबोधित करता है।
ग्रेग हेंडरशॉट

1
शायद। क्यों के लिए +1। हालांकि एक मायने में, कम से कम सवाल पूछने वाला सिर्फ यूनियन और चौराहे के बारे में जानने से संतुष्ट था।
प्लैटिनम एज़्योर

2
@ प्लैटिनम: मुझे वास्तव में पूछे गए प्रश्न का उत्तर देना पसंद है, इसलिए जब कोई दूसरा व्यक्ति आता है तो उस प्रश्न को सभी उचित उत्तर देख सकते हैं; भले ही मूल प्रश्न पूछने वाला व्यक्ति आगे बढ़ गया हो। हम दोनों के बीच, हम इसका जवाब अच्छी तरह से देते हैं।
सिंगलएनजेशन इलिमिनेशन

1
@TokenMacGuy: "क्योंकि पायथन बस ऑपरेटर को परिभाषित नहीं करता था" भी क्यों जवाब देता है। :-P
प्लेटिनम

15
मुझे यकीन नहीं है कि यह करता है; "क्योंकि यह नीला है" यह नहीं समझाता है "आकाश नीला क्यों है?"
सिंगलएनजेशन इलिमिनेशन

36

सेट सिद्धांत में + प्रतीक सामान्य रूप से दो सेटों की असंगति को दर्शाता है । यदि A और B सेट हैं, तो उनके असंतुष्ट संघ को सेट माना जाता है

A + B = {(a, 1) | a in A} U {(b, 2) | b in B}

यानी, असंतुष्ट संघ का निर्माण करने के लिए, हम ए के सभी तत्वों और बी के सभी तत्वों को अलग-अलग टैग के साथ चिह्नित करते हैं (उदाहरण में मैंने संख्या 1 और 2 का उपयोग किया था, लेकिन कोई भी दो अलग-अलग "चीजें" काम करेगी) और फिर ले जाएं दो परिणामी सेटों का मिलन। उपरोक्त उदाहरण में, मैंने सामान्य गणितीय संकेतन के समान बनाने के लिए सेट यूनियन के लिए 'यू' का उपयोग किया है; नीचे मैं पायथन संकेतन का उपयोग करता हूं, '' | ' संघ के लिए, और 'और' चौराहे के लिए।

यदि A और B असंतुष्ट हैं, तो A + B में A के साथ 1-टू -1 पत्राचार है B. यदि वे नहीं हैं, तो A & B में सभी सामान्य तत्व x A + B में दो बार दिखाई देते हैं: एक बार (x, 1) के रूप में, और एक बार (x, 2) के रूप में।

इसलिए, चूंकि '+' चिह्न का एक सेट ऑपरेशन के रूप में काफी अच्छी तरह से स्थापित अर्थ है, मुझे यह बहुत संगत लगता है कि पायथन सेट या संघ के लिए इस प्रतीक का उपयोग नहीं करता है। संभवतः पायथन डिजाइनर (ओं) को यह ध्यान में था जब उन्होंने सेट ऑपरेटरों को चुना था।


5
यह इष्टतम उत्तर है। इस प्रतिक्रिया को पढ़ने से पहले, मैंने यह सोचा कि क्यों गिडो |ने सेट यूनियनों के लिए ऑपरेटर को ओवरलोड किया था, लेकिन यह करने में नाकाम रहा कि गुइडो ने +सेट यूनियनों के लिए ऑपरेटर को ओवरलोड करने से क्यों रोका । आखिरकार, ऐसा करने से +संचालक के साथ ऑर्थोगोनलिटी संरक्षित हो जाएगी, जो सूची के अतिरिक्त ओवरलोडेड थे। चूंकि पायथन की पहचान गणितीय संकेतन के साथ अनुरूप है (उदाहरण के लिए, jजटिल संख्याओं के जटिल घटक को दर्शाते हुए), गुइडो की जिज्ञासु पसंद अंत में समझ में आती है।
सेसिल करी

23

ज़रूर, वे +एक संघ करने के लिए इस्तेमाल कर सकते थे , लेकिन तब भी चौराहे के लिए एक प्रतीक की आवश्यकता होगी। चौराहे के |लिए संघ सममित है &और इस तरह एक बेहतर विकल्प है।


10

क्योंकि |साधन का अर्थ है, मिलन और &प्रतिच्छेदन। समान फ़ंक्शन के लिए कई ऑपरेटरों को जोड़ने का स्पष्ट रूप से कोई कारण नहीं है।

उपयोग करने के कारण |और &शायद बिटवाइज़ ऑपरेशन में वापस चला जाता है। यदि आप किसी संख्या में बिट्स के रूप में एक सेट का प्रतिनिधित्व करते हैं, तो वे ऑपरेटर हैं जो आप संघ और प्रतिच्छेद करने के लिए उपयोग करेंगे।

+साधारण के रूप में संघ से बंधा नहीं है और -अंतर सेट करने के लिए है।


3

क्योंकि सेट अंतर एक बहुत ही उपयोगी और सामान्य रूप से ज्ञात अवधारणा है, लेकिन “सेट जोड़” की कोई (सार्वभौमिक उपयोग की गई) अवधारणा नहीं है।


1
संघ? जब आखिरी बार आपने किसी को, संघ ’के बजाय the सेट’ कहते हुए सुना था, या instead के बजाय + का उपयोग किया था? कभी-कभी सदस्य-वार जोड़ के+ रूप में परिभाषित किया जाता है । कुछ इसे सममित अंतर के लिए उपयोग करते हैं । किसी भी तरह से, इसका उपयोग करने वाला कोई भी कागज या तो इसे कुछ और कहता है या इसे पहले परिभाषित करता है।
पेट्र विक्टोरिन

1
यदि कोई उचित शब्द नहीं जानता है तो कोई इसे 'सेट अप' के रूप में संदर्भित कर सकता है। स्पष्ट रूप से 'यूनियन' शब्द को जानने वाले लोग 'यूनियन' शब्द का इस्तेमाल करते हैं।
शराबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.