Skip to content
This page has been auto-translated and may contain errors.View in English

टपल और सेट

docs.scrimba.com

आप लिस्ट को जानते हैं। Python के पास दो और कलेक्शन प्रकार हैं जो लिस्ट नहीं कर सकते। टपल मानों का एक निश्चित समूह रखते हैं जो कभी नहीं बदलेगा। सेट केवल अद्वितीय मान रखते हैं और आपको तुरंत सदस्यता जाँचने देते हैं चाहे कलेक्शन कितना भी बड़ा हो।

Python के कलेक्शन टूलकिट के चार प्रकार हैं। लिस्ट और डिक्शनरी अधिकतर सामान्य मामलों को संभालते हैं। टपल और सेट विशिष्ट मामलों को हल करते हैं: निश्चित रिकॉर्ड जहाँ immutability एक लाभ है, और अद्वितीय-मान कलेक्शन जहाँ O(1) सदस्यता परीक्षण प्राथमिकता है।

list और dict से परे, Python आपको tuple (एक निश्चित-लंबाई अनुक्रम जिसे आप बनाने के बाद नहीं बदल सकते) और set (अद्वितीय मानों का एक unordered कलेक्शन, एक hash टेबल पर बना, वही संरचना जो dict को तेज़ बनाती है) देता है। नीचे दिए गए हर निर्णय को चलाने वाला विभाजन: एक टपल hashable है (इसकी सामग्री को एक एकल संख्या में घटाया जा सकता है इसलिए यह डिक्शनरी की के रूप में या सेट सदस्य के रूप में कार्य कर सकता है), एक लिस्ट नहीं है। आवश्यकता के आधार पर चुनें कि कलेक्शन को क्या करने की आवश्यकता है, आदत से क्या चुनते हैं इसके आधार पर नहीं।

टपल

एक टपल मानों का एक क्रमबद्ध समूह है जिसे आप बनाने के बाद नहीं बदल सकते। कोष्ठक एक टपल को परिभाषित करते हैं, लेकिन वे वैकल्पिक हैं। अल्पविराम वह है जो वास्तव में एक टपल बनाता है। एक एकल-आइटम टपल को अनुगामी अल्पविराम की आवश्यकता होती है।

टपल immutable अनुक्रम हैं। अल्पविराम, कोष्ठक नहीं, टपल बनाता है। Immutability उन्हें hashable बनाता है जब सभी उनके तत्व भी हों, जो उपयोग के मामलों को खोलता है जो लिस्ट नहीं कर सकते: डिक्शनरी की, सेट सदस्य, और निश्चित-संरचना रिकॉर्ड।

एक tuple एक निश्चित-लंबाई अनुक्रम है जिसे आप एक बार बनाने के बाद नहीं बदल सकते। क्योंकि इसके अंदर कुछ नहीं हिलता, Python इसके लिए एक एकल hash की गणना कर सकता है (इसकी सामग्री से व्युत्पन्न एक संख्या) जब तक कि हर तत्व स्वयं hashable हो, जो एक टपल को डिक्शनरी की या सेट सदस्य के रूप में काम करने देता है जहाँ एक लिस्ट नहीं कर सकती। अनुक्रमण और slicing बिल्कुल लिस्ट की तरह काम करते हैं; कोई आइटम असाइनमेंट नहीं है, इसलिए point[0] = 99 जब वह पंक्ति चलती है तो TypeError उठाता है। एकल-आइटम फॉर्म (42,) को अनुगामी अल्पविराम की आवश्यकता होती है। इसके बिना, कोष्ठक केवल समूह बनाते हैं और आप बिना मूल्य 42 वापस पाते हैं।

python
point = (10, 20)
rgb = (255, 128, 0)
dimensions = (1920, 1080)
single = (42,)            # एकल-आइटम टपल के लिए अनुगामी अल्पविराम आवश्यक है
also_tuple = 42, 99       # कोष्ठक वैकल्पिक हैं; अल्पविराम इसे टपल बनाता है

अनुक्रमण द्वारा एक्सेस बिल्कुल लिस्ट की तरह काम करता है। किसी आइटम को बदलने का प्रयास TypeError उठाता है:

अनुक्रमण, slicing, और नकारात्मक सूचकांक सभी लिस्ट के समान काम करते हैं। अनुक्रमण के माध्यम से कोई भी असाइनमेंट का प्रयास TypeError उठाता है; यह आशाप्रद है, एक सीमा नहीं।

टपल से पढ़ना, अनुक्रमण, नकारात्मक अनुक्रमण, या slice द्वारा, बिल्कुल लिस्ट की तरह काम करता है। लिखना वह है जो अलग है: कोई आइटम असाइनमेंट नहीं है, इसलिए point[0] = 99 जैसे ही वह पंक्ति चलती है TypeError उठाता है। यह पूरा बिंदु है टपल को लिस्ट से चुनना। यह एक मान है कि आप और बाद में हर पाठक विश्वास कर सकते हैं कि यह आपके नीचे नहीं बदलेगा।

python
point = (10, 20)
point[0]    # 10
point[1]    # 20
point[-1]   # 20

point[0] = 99    # TypeError: 'tuple' object does not support item assignment
Junoटपल एक टपल मानों का एक क्रमबद्ध समूह है जिसे आप बनाने के बाद नहीं बदल सकते। अल्पविराम वह है जो इसे बनाता है, कोष्ठक नहीं, इसीलिए (42,) को उस अकेले अनुगामी अल्पविराम की आवश्यकता है। किसी आइटम को पुनः असाइन करने का प्रयास करें और आपको TypeError मिलता है, और वह locked-in महसूस बिल्कुल वही है कि आप टपल क्यों चुनेंगे।
Junoटपल टपल immutable अनुक्रम हैं, और अल्पविराम उन्हें बनाता है, कोष्ठक नहीं। वह immutability एक विशेषता है: यह एक टपल को hashable बनाता है जब इसकी सामग्री हो, इसलिए यह डिक्शनरी की या सेट सदस्य हो सकता है जहाँ एक लिस्ट नहीं कर सकती। आइटम असाइनमेंट डिज़ाइन द्वारा TypeError उठाता है।
Junoटपल टपल पढ़ना लिस्ट से मेल खाता है; लिखना वह है जो गायब है, इसलिए point[0] = 99 runtime पर TypeError उठाता है। उस पर निर्भर रहें: एक टपल वह मान है जो आप चारों ओर पास करते हैं जब आपको एक गारंटी की आवश्यकता हो कि downstream कोई इसे फिर से नहीं लिखेगा। एकल-आइटम (42,) जाल सबको एक बार पकड़ता है।

कब टपल का उपयोग करें

टपल का उपयोग करें जब आपके पास संबंधित मानों का एक छोटा समूह हो जो एक साथ हो और नहीं बदलेगा। निर्देशांक (x, y), एक रंग (r, g, b), एक नाम-स्कोर जोड़ी ("अमित", 87)। निश्चित संरचना किसी को भी कोड पढ़ने के लिए संकेत देती है कि यह समूह एकल इकाई के रूप में माना जाता है।

टपल निश्चित संरचना संप्रेषित करते हैं: एक समूह जहाँ स्थिति अर्थ रखती है और समूह को एक इकाई के रूप में माना जाता है। उनकी hashability उन्हें डिक्शनरी की के रूप में वैध बनाती है, जो लिस्ट नहीं हो सकती। टपल जो अनुबंध संकेत करता है: ये मान एक साथ हैं और परिवर्तित नहीं होने चाहिए।

एक टपल तक पहुँचें जब आपके पास निश्चित आकार का एक रिकॉर्ड हो: ज्ञात संख्या में fields जहाँ प्रत्येक स्थिति कुछ विशेष अर्थ रखती है। क्योंकि टपल hashable है (इसकी सामग्री एक एकल संख्या में घटती है), यह कहीं भी एक hashable मान की आवश्यकता हो वहाँ फिट बैठता है: एक डिक्शनरी की, एक सेट सदस्य, या functools.lru_cache के पीछे cached तर्क, जो फ़ंक्शन के परिणामों को याद रखता है। शब्दार्थ संकेत भी लिस्ट से अलग है। एक टपल कहता है "ये fields एक साथ हैं और प्रत्येक स्थिति एक अर्थ रखती है" (एक coordinate, एक रंग), जहाँ एक लिस्ट कहती है "समान चीजों का एक रन जिसकी लंबाई बदल सकती है।"

Junoकब टपल का उपयोग करें टपल के लिए पहुँचें जब आपके पास एक निश्चित छोटा समूह हो जहाँ प्रत्येक जगह कुछ अर्थ रखती है: एक coordinate, एक (r, g, b) रंग, एक नाम-और-स्कोर जोड़ी। क्योंकि टपल hashable हैं, आप एक को डिक्शनरी की के रूप में भी उपयोग कर सकते हैं। एक लिस्ट ऐसा नहीं कर सकती, जो पहली बार लोगों को परेशान करता है जब वे कोशिश करते हैं।
Junoकब टपल का उपयोग करें एक टपल निश्चित संरचना संकेत देता है: स्थिति अर्थ रखती है और समूह एक इकाई के रूप में यात्रा करता है। यह लिस्ट से अंतर है, जो कहती है "एक अनुक्रम जिसकी लंबाई बदल सकती है।" और चूँकि टपल hashable हैं, वे डिक्शनरी की के रूप में काम करते हैं जहाँ लिस्ट TypeError उठाती है।
Junoकब टपल का उपयोग करें निश्चित-आकार रिकॉर्ड के लिए टपल, variable-लंबाई समान चीजों के रन के लिए लिस्ट। लाभ hashability है: एक टपल डिक्शनरी की, सेट, या lru_cache की में जाता है, सभी जगह जहाँ लिस्ट नहीं जा सकती। मंतव्य को वह अनुबंध ले जाने दें एक comment की जगह।
python
locations = {}
locations[(40, -74)] = "दिल्ली"   # डिक्शनरी की के रूप में टपल, काम करता है
locations[[40, -74]] = "दिल्ली"   # डिक्शनरी की के रूप में लिस्ट, TypeError

Unpacking

Unpacking एक टपल से मानों को निकालता है और प्रत्येक को एक एकल पंक्ति में अपने नाम को असाइन करता है। नामों की संख्या मानों की संख्या से मेल खानी चाहिए। बचे हुए किसी भी आइटम को एक लिस्ट में कैप्चर करने के लिए * का उपयोग करें।

Unpacking किसी भी iterable पर काम करता है: टपल, लिस्ट, स्ट्रिंग। लक्ष्य नामों की संख्या iterable की लंबाई से मेल खानी चाहिए, जब तक कि एक starred लक्ष्य variable-लंबाई slice को पकड़े नहीं। Mismatch ValueError उठाता है। Unpacking एक फ़ंक्शन से कई return मानों का उपभोग करने का idiomatic तरीका है।

Unpacking किसी भी iterable पर काम करता है (कुछ भी जो आप loop कर सकते हैं), न कि केवल टपल, दाहिनी ओर को चलाता है और प्रत्येक मान को क्रम में अपने लक्ष्य नाम से binding करता है। एक starred लक्ष्य (*rest) बचे हुए आइटम को एक list में soak करता है, इसलिए संख्या को बिल्कुल मेल खाने की ज़रूरत नहीं है। एक सादा गणना mismatch runtime पर ValueError उठाता है। सबसे अधिक form जो आप पहुँचते हैं वह for header में है: for name, score in pairs प्रत्येक आइटम को loop करते समय unpacks करता है, जो हाथ से प्रत्येक जोड़ी को अनुक्रमण करने से कहीं अधिक स्पष्ट पढ़ता है।

JunoUnpacking Unpacking एक टपल या लिस्ट से प्रत्येक मान को निकालता है और एक पंक्ति में इसे अपना नाम देता है, जैसे x, y = point। नामों की संख्या मानों की संख्या से मेल खानी चाहिए, जब तक कि आप बचे हुए को scoop करने के लिए *rest जोड़ें। यह मेरे लिए क्लिक हुआ जिस दिन मैंने हर जगह point[0] और point[1] लिखना बंद किया।
JunoUnpacking Unpacking प्रत्येक मान को एक पंक्ति में अपने नाम को असाइन करता है, और एक starred लक्ष्य जैसे *rest एक variable-लंबाई slice को पकड़ता है। गणना जो line up नहीं करती `ValueError` उठाती है। यह एक फ़ंक्शन से कई return मान लेने का स्वच्छ तरीका है फलस्वरूप को अनुक्रमण करने की बजाय।
JunoUnpacking Unpacking किसी भी iterable पर चलता है और बाएँ-दाएँ bind करता है; *rest slack को absorb करता है, एक सादा mismatch ValueError उठाता है। जहाँ यह सबसे अधिक लाभ देता है वह for header में है, for name, score in pairs, जो अनुक्रमण द्वारा प्रत्येक जोड़ी में पहुँचने को beat करता है।
python
point = (10, 20)
x, y = point

print(x)   # 10
print(y)   # 20

first, *rest = [1, 2, 3, 4, 5]
# first = 1, rest = [2, 3, 4, 5]

head, *middle, tail = [1, 2, 3, 4, 5]
# head = 1, middle = [2, 3, 4], tail = 5

नामित टपल

एक नामित टपल एक टपल है जहाँ प्रत्येक स्थिति का एक नाम है। point[0] x-coordinate है यह याद रखने की बजाय, आप point.x लिखते हैं। मान अभी भी immutable हैं; आप संख्यात्मक स्थिति की बजाय readable attribute नाम प्राप्त करते हैं।

namedtuple एक class generate करता है जो बिल्कुल एक टपल की तरह काम करता है लेकिन नामित attribute access जोड़ता है। यह एक पूर्ण class से हल्का है, immutable है, और स्व-documented है। इसका उपयोग तब करें जब एक सादे टपल की positional access को समझने के लिए एक comment की आवश्यकता होगी।

collections.namedtuple एक class factory है (एक फ़ंक्शन जो एक brand-new class बना और आपको hand back करता है)। यह जो class return करता है वह एक tuple है नामित fields के साथ, इसलिए यह एक सादे टपल जैसी memory cost करता है जबकि बहुत बेहतर पढ़ता है। आप _asdict() (इसे dict में बदलें), _replace() (एक field बदला हुआ एक copy बनाएँ, क्योंकि आप इसे mutate नहीं कर सकते), और _fields मुफ्त में पाते हैं। जब आपको अधिक की आवश्यकता हो, default मान या type annotations, typing.NamedTuple annotated case को cover करता है, और dataclasses.dataclass आधुनिक विकल्प है एक बार जब आप methods या optional mutability चाहते हैं।

Junoनामित टपल एक नामित टपल हर स्थिति को एक नाम देता है, इसलिए आप point.x लिखते हैं point[0] x है यह याद रखने की बजाय। यह अभी भी पूरी तरह immutable है और हर दूसरे तरीके से एक नियमित टपल की तरह काम करता है। कोड पढ़ने वाले आपके भविष्य के आप नामों के लिए आपको धन्यवाद देंगे।
Junoनामित टपलnamedtuple नामित attribute access के साथ एक tuple-like class बनाता है, immutable और स्व-documented, एक पूर्ण class से कम weight के लिए। इसे उसी क्षण पहुँचें जब एक सादे टपल की स्थिति को समझाने के लिए एक comment की आवश्यकता होगी। इसके बाद, dataclass आधुनिक step up है।
Junoनामित टपलnamedtuple आपको एक tuple subclass with नामित fields देता है उसी memory cost पर, plus _replace() और _asdict() मुफ्त में। एक बार जब आप defaults, methods, या वास्तविक type hints चाहते हैं, factory के साथ लड़ने की बजाय typing.NamedTuple या dataclass पर jump करें।

namedtuple standard library में रहता है, इसलिए इसे पहले एक import की आवश्यकता होती है: from collections import namedtuple। Imports को पूर्ण उपचार Modules अध्याय में मिलता है।

python
from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
Player = namedtuple("Player", ["name", "score", "level"])

p = Point(10, 20)
p.x    # 10
p.y    # 20

राज = Player("राज", 87, 5)
राज.name    # "राज"
राज.score   # 87

सेट

एक सेट अद्वितीय मानों का एक कलेक्शन है कोई guaranteed क्रम के साथ। एक ही मान को दो बार जोड़ने से कुछ नहीं होता: एक सेट हर आइटम की केवल एक copy रखता है। items के साथ एक सेट के लिए curly braces का उपयोग करें, या एक empty सेट बनाने के लिए set()

set एक unordered कलेक्शन है जो स्वचालित रूप से duplicates को reject करता है। Membership testing O(1) है आकार की परवाह किए बिना, जो इसे सही tool बनाता है जब भी आपको यह जाँचने की आवश्यकता हो कि एक मान एक बड़े कलेक्शन में मौजूद है। नोट: {} एक empty dict बनाता है, एक empty सेट नहीं; इसके लिए set() का उपयोग करें।

एक set अद्वितीय, hashable मान रखता है और एक hash टेबल पर बना है, डिक्शनरी के साथ वही look-by-content संरचना। यह आपको O(1) average membership, insertion, और deletion देता है (cost flat रहती है जैसे सेट बढ़ता है, आकार के साथ climbing की बजाय)। दो परिणाम जिन्हें आपको plan के चारों ओर करना है: केवल hashable मान इसमें जा सकते हैं, इसलिए int, str, और tuple ठीक हैं लेकिन list, dict, और set नहीं हैं, और iteration order आंतरिक hash स्थिति के बाद है, इसलिए कभी भी इस पर भरोसा न करें कि यह स्थिर हो। एक syntax trap: {} एक empty dict है, एक empty सेट नहीं; set() का उपयोग करें।

Junoसेट एक सेट केवल अद्वितीय मान रखता है, इसलिए जो कुछ पहले से यहाँ है उसे जोड़ना कुछ नहीं करता है, कोई error नहीं, कोई duplicate नहीं। एक items के साथ curly braces से बनाएँ, लेकिन एक empty सेट के लिए set() तक पहुँचें, क्योंकि {} secretly एक empty dict है। वह आखिरी बिट लगभग सबको पकड़ता है।
Junoसेट एक सेट automatically duplicates को drop करता है और membership को O(1) में test करता है चाहे यह कितना भी बड़ा हो, जो इसे सही tool बनाता है "यह यहाँ है?" एक बड़े कलेक्शन पर। empty-सेट trap को देखें: {} एक dict है, इसलिए set() का उपयोग करें।
Junoसेट एक सेट unique hashable मान की एक hash टेबल है: O(1) membership, insert, और delete, cost पर कि केवल hashable items जाते हैं और iteration order कभी भी स्थिर नहीं है। उस order पर lean न करें, और याद रखें {} एक dict है, इसलिए एक empty सेट चाहते समय set() तक पहुँचें।
python
tags = {"python", "beginner", "tutorial"}
numbers = {1, 2, 3, 4, 5}
empty = set()    # नहीं {} (वह एक empty dict है)

एक ही मान को दो बार जोड़ने से सेट नहीं बदलता:

python
tags.add("python")   # tags unchanged है, "python" पहले से इसमें है

कब सेट का उपयोग करें

सेट तीन चीजों के लिए सही tool हैं: एक लिस्ट से duplicates को हटाना, जल्दी जाँचना कि क्या कुछ एक बड़े कलेक्शन में है, और दो समूहों की तुलना करना कि वे क्या साझा करते हैं या अलग करते हैं।

तीन distinct use मामले सेट usage को drive करते हैं: deduplication (insertion पर automatic), O(1) membership testing (लिस्ट के लिए O(n) बनाम), और सेट algebra (|, &, -, ^)। जब कलेक्शन बड़ा हो और आप membership को अक्सर check करते हों, तो performance अंतर substantial है।

तीन use मामले सीधे hash टेबल से आते हैं: uniqueness (duplicates insertion पर reject किए जाते हैं), O(1) membership (cost of in flat रहती है जैसे सेट बढ़ता है), और सेट algebra (|, &, -, ^)। membership test वह है जो real code में pay off करता है: 10,000 items के सेट पर in 10 items के सेट पर जितना तेज़ है, जहाँ same check लिस्ट पर O(n) है और linearly slow करता है। जब आप अपने आप को एक बड़ी लिस्ट के विरुद्ध बार-बार x in some_list करते हुए पाते हैं, तो इसे एक बार एक सेट में convert करना आमतौर पर fix है।

Junoकब सेट का उपयोग करें तीन jobs जो सेट बहुत अच्छे हैं: एक लिस्ट से duplicates को strip करना, जल्दी check करना कि क्या कुछ एक big collection में है, और दो समूहों की तुलना करना कि वे क्या साझा करते हैं या अलग करते हैं। अगर उनमें से कोई भी वह है जो आप कर रहे हैं, एक सेट शायद tool है।
Junoकब सेट का उपयोग करें तीन drivers: insert पर deduplication, एक लिस्ट के लिए O(1) membership बनाम O(n), और |, &, -, ^ के साथ सेट algebra। बड़ा कलेक्शन और अधिक बार जब आप in check करते हैं, सेट अधिक आगे खींचता है।
Junoकब सेट का उपयोग करें Uniqueness, O(1) in, और सेट algebra, सभी hash टेबल से गिरते हैं। membership win practical है: repeated `x in big_list` हर बार O(n) है, इसलिए उस लिस्ट को एक बार सेट में convert करना usual fix है।
python
# एक लिस्ट से duplicates को हटाएँ
raw = ["cat", "dog", "cat", "bird", "dog", "cat"]
unique = list(set(raw))   # ["cat", "dog", "bird"] (क्रम guaranteed नहीं है)
python
# तेज़ membership check
valid_codes = {"USD", "EUR", "GBP", "JPY"}
code = "EUR"

if code in valid_codes:    # तुरंत lookup, हज़ारों codes के साथ भी
    print("Valid")

सेट operations

सेट उन्हीं operations को support करते हैं जो आपने गणित में सीखा: union (दोनों में सब कुछ), intersection (केवल वह जो दोनों सेट साझा करते हैं), और difference (क्या एक के पास दूसरे के पास नहीं है)। Python इनके लिए operator symbols का उपयोग करता है, और प्रत्येक का एक method समकक्ष है।

Python के सेट operators गणितीय notation को mirror करते हैं: union के लिए |, intersection के लिए &, difference के लिए -, symmetric difference के लिए ^। प्रत्येक operator का एक method form है (.union(), .intersection(), आदि) जो किसी भी iterable को भी accept करता है, केवल सेट को नहीं।

operator forms (|, &, -, ^) दोनों पक्षों को सेट होने की आवश्यकता होती है और अगर कोई list जैसी कोई और चीज़ है तो TypeError उठाता है। method forms (.union(), .intersection(), और बाकी) looser हैं: वे किसी भी iterable को accept करते हैं और आपके लिए convert करते हैं, इसलिए a.union([1, 2]) काम करता है जहाँ a | [1, 2] fail करता है। वह अंतर वह है जो याद रखने के लिए है जब एक operation blows up। in-place forms भी हैं (|=, &=, -=, ^=) जो left सेट को update करते हैं बजाय एक नया return करने के, .update(), .intersection_update(), और आदि को calling जैसा ही।

Junoसेट operations गणित class से चार operations: | union है (किसी में), & intersection है (दोनों में), - difference है (एक में लेकिन दूसरे में नहीं), और ^ symmetric difference है (एक में लेकिन दोनों में नहीं)। प्रत्येक का एक spelled-out method भी है जैसे .union() अगर आप symbols की बजाय words को prefer करते हैं।
Junoसेट operations| union, & intersection, - difference, ^ symmetric difference। method forms (.union() और friends) समान करते हैं लेकिन किसी भी iterable को accept करते हैं, केवल सेट को नहीं, जो operators नहीं करेंगे।
Junoसेट operations Operators दोनों पक्षों को सेट होना चाहते हैं और अन्यथा `TypeError` उठाते हैं; method forms कोई भी iterable लेते हैं, इसलिए `a.union([1, 2])` काम करता है जहाँ `a | [1, 2]` नहीं। in-place forms (|=, &=) एक नया सेट return करने की बजाय in place update करते हैं।
python
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

a | b    # {1, 2, 3, 4, 5, 6}   (union: दोनों में सब कुछ)
a & b    # {3, 4}               (intersection: केवल दोनों में)
a - b    # {1, 2}               (difference: a में लेकिन b में नहीं)
b - a    # {5, 6}               (difference दूसरा रास्ता)
a ^ b    # {1, 2, 5, 6}        (symmetric difference: एक में लेकिन दोनों में नहीं)

इनके भी method forms हैं: .union(), .intersection(), .difference(), .symmetric_difference()

सेट को modify करना

सेट mutable हैं। .add() एक आइटम जोड़ता है। .update() कई एक साथ जोड़ता है किसी भी लिस्ट या अन्य iterable से। .remove() एक आइटम को delete करता है लेकिन अगर यह नहीं है तो एक error उठाता है। .discard() चुप्पी से delete करता है अगर आइटम exist करता है और कुछ नहीं करता है अगर यह नहीं है।

.add() average में O(1) है। .update() किसी भी iterable को accept करता है और एक loop में .add() को calling के समान है। .remove() एक miss पर KeyError उठाता है, जबकि .discard() safe विकल्प है जब presence uncertain है। .pop() एक arbitrary element को remove करता है, "last" को नहीं क्योंकि सेट का कोई order नहीं है।

.add(x) average में O(1) में एक आइटम insert करता है; .update(iterable) कई जोड़ता है और |= के समान है। जोड़ी जो लोगों को काटती है वह .remove() बनाम .discard() है: दोनों एक आइटम delete करते हैं, लेकिन .remove() जब आइटम absent हो तो KeyError उठाता है जबकि .discard() quietly कुछ नहीं करता है। .discard() तक पहुँचें जब भी presence uncertain हो, इसलिए एक missing आइटम एक exception नहीं है जिसे आपको wrap करना पड़े। .pop() कुछ element को return और remove करता है, लेकिन कौन सा अपरिभाषित है: एक सेट का कोई order नहीं है, इसलिए कभी भी .pop() को "last" आइटम के रूप में treat न करें।

Junoसेट को modify करना.add() एक आइटम को put करता है, .update() एक लिस्ट या अन्य iterable से एक पूरे batch को जोड़ता है। removal को straighten करने के लिए जोड़ी: .remove() error करता है अगर आइटम नहीं है, जबकि .discard() shrug करता है और move on करता है। जब आप सुनिश्चित नहीं हैं यह सेट में है, .discard() आपको एक stray error बचाता है।
Junoसेट को modify करना.add() एक के लिए, .update() कई के लिए किसी भी iterable से। .remove() miss पर `KeyError` उठाता है; .discard() safe version है जो इसे ignore करता है। और .pop() एक arbitrary element खींचता है, "last" एक नहीं, क्योंकि सेट का कोई order नहीं है।
Junoसेट को modify करना.add() O(1) है, .update() `|=` है। trap `.remove()` है जो `KeyError` उठाता है जहाँ .discard() quiet रहता है, इसलिए जब presence uncertain हो default को `.discard()` के लिए। .pop() एक undefined element return करता है; कभी भी इसे last एक के रूप में read न करें।
python
tags = {"python", "beginner"}

tags.add("tutorial")          # एक आइटम जोड़ें
tags.update(["web", "api"])   # किसी भी iterable से कई आइटम जोड़ें
tags.remove("beginner")       # remove, अगर नहीं मिला तो KeyError उठाता है
tags.discard("missing")       # remove, अगर नहीं मिला तो कोई error नहीं
tags.pop()                    # remove और एक arbitrary आइटम return करें
tags.clear()                  # सब कुछ remove करें

.discard() का उपयोग करें जब आप सुनिश्चित नहीं हैं कि आइटम exist करता है।

Frozen सेट

एक frozen सेट एक सेट है जिसे आप creation के बाद modify नहीं कर सकते। main reason उपयोग करने के लिए: frozen सेट hashable हैं, इसलिए उन्हें डिक्शनरी key के रूप में या अन्य सेट के अंदर stored किया जा सकता है।

frozenset set का immutable counterpart है। यह सभी read operations और सेट algebra को support करता है लेकिन mutation को नहीं। इसकी immutability इसे hashable बनाती है, मतलब यह एक डिक्शनरी की या एक दूसरे सेट के अंदर एक सदस्य के रूप में वैध है।

एक frozenset एक set है जिसे आप create करने के बाद नहीं बदल सकते। क्योंकि इसके अंदर कुछ नहीं हिलता, यह एक स्थिर hash प्राप्त करता है और स्वयं hashable है, इसलिए यह एक डिक्शनरी की या एक दूसरे सेट का सदस्य हो सकता है, जो एक सादा set नहीं कर सकता। सब कुछ जो read करता है या एक नया कलेक्शन return करता है अभी भी काम करता है (membership, सेट algebra operators), जबकि mutating methods (add, remove, और बाकी) चले गए हैं। case जो cleanly fit करता है: एक constant lookup टेबल जो program चलने के समय नहीं बदल सकता और एक डिक्शनरी या सेट के अंदर रहने की आवश्यकता हो सकती है।

JunoFrozen सेट एक frozen सेट एक सेट है जिसे आप बनाने के बाद नहीं बदल सकते। वह locked-in स्थिति वह है जो इसे hashable बनाती है, इसलिए एक नियमित सेट के विपरीत आप एक को डिक्शनरी की के रूप में उपयोग कर सकते हैं या इसे एक दूसरे सेट के अंदर tuck कर सकते हैं। इसे तक पहुँचें जब आपके पास allowed values का एक निश्चित समूह हो जो कभी भी shift न होना चाहिए।
JunoFrozen सेटfrozenset immutable `set` है: सभी reads और सेट algebra, कोई mutation नहीं। इसकी immutability hashability खरीदता है, इसलिए यह एक डिक्शनरी की के रूप में या एक दूसरे सेट के सदस्य के रूप में काम करता है जहाँ एक सादा `set` उठाता है। एक constant lookup टेबल के लिए अच्छा fit।
JunoFrozen सेटfrozenset का एक स्थिर hash है, इसलिए यह जहाँ `set` नहीं कर सकता जाता है: डिक्शनरी keys, एक दूसरे सेट के सदस्य। Reads और सेट algebra रहते हैं, mutation methods चले गए हैं। clean use एक constant lookup टेबल है जिसे runtime पर नहीं बदलना चाहिए।
python
valid_statuses = frozenset({"active", "paused", "deleted"})
valid_statuses.add("archived")    # AttributeError, frozenset immutable है

सही कलेक्शन को चुनना

चार प्रकार, प्रत्येक एक स्पष्ट role के साथ। पूछें कि आपको डेटा के साथ क्या करने की आवश्यकता है और सही विकल्प आमतौर पर अनुसरण करता है।

कलेक्शन types के बीच विकल्प इस बारे में है कि कौन से operations महत्वपूर्ण हैं और आपके डेटा के पास क्या constraints हैं: mutability, ordering, duplicate handling, और lookup strategy।

विकल्प part performance, part meaning है। dict और set hashing के माध्यम से O(1) average lookup देते हैं, इसलिए membership को check करना उन्हें बढ़ते समय तेज़ रहता है। list और tuple अनुक्रमण द्वारा O(1) access देते हैं लेकिन O(n) membership, जहाँ in आकार के साथ slow करता है। दूसरा axis वह है जो type संकेत करता है: एक tuple एक निश्चित रिकॉर्ड है जिसकी immutability hashability खरीदता है, जहाँ list एक variable-लंबाई अनुक्रम है। जब आपको एक hashable कलेक्शन की आवश्यकता हो एक डिक्शनरी या सेट के अंदर nest करने के लिए, tuple और frozenset दोनों built-in प्रकार हैं जो ऐसा कर सकते हैं।

Junoसही कलेक्शन को चुनना चार प्रकार, चार clear jobs: ordered चीजों के लिए लिस्ट जिन्हें आप change करेंगे, निश्चित records के लिए टपल, unique values और तेज़ "क्या यह यहाँ है?" checks के लिए सेट, नाम से चीजों को look up करने के लिए डिक्शनरी। पूछें कि आपको डेटा के साथ क्या करने की आवश्यकता है और सही usually गिरता है।
Junoसही कलेक्शन को चुनना क्या डेटा की आवश्यकता है के आधार पर चुनें: mutability, क्रम, क्या duplicates matter, और आप चीजों को कैसे look up करते हैं। एक ordered अनुक्रम के लिए list जिसे आप mutate करते हैं, एक निश्चित record के लिए tuple, unique values और O(1) membership के लिए set, key-value lookup के लिए dict।
Junoसही कलेक्शन को चुनना आधा performance, आधा meaning: `dict` और `set` O(1) lookup देते हैं, `list` और `tuple` अनुक्रमण द्वारा O(1) देते हैं लेकिन O(n) membership। एक `tuple` "निश्चित record" को भी संकेत देता है और hashability खरीदता है। जब आपको एक hashable कलेक्शन को nest करने की आवश्यकता हो, `tuple` और `frozenset` आपके दो विकल्प हैं।
listtuplesetdict
Orderedहाँहाँनहींहाँ (insertion order)
Mutableहाँनहींहाँहाँ
Duplicatesहाँहाँनहींनहीं (keys)
Access byअनुक्रमणअनुक्रमणn/aकी
Use whenOrdered, changeable अनुक्रमनिश्चित recordअद्वितीय मान, तेज़ membershipkey-value lookup

एक quick decision rule:

  • कुछ नाम से look up करने की जरूरत है? → dict
  • एक ordered कलेक्शन चाहिए जिसे आप modify करेंगे? → list
  • संबंधित मानों का एक निश्चित समूह है? → tuple
  • अद्वितीय मान या तेज़ membership tests चाहिए? → set

व्यवहार में

निश्चित records store करने के लिए टपल और unique values को track करने के लिए सेट का उपयोग:

python
home = (28.7041, 77.1025)   # latitude, longitude
office = (28.5355, 77.3910)

home_lat, home_lon = home
print(f"Home: {home_lat}, {home_lon}")

# अद्वितीय visitors को track करें एक सेट के साथ
visitors = set()
visitors.add("राज")
visitors.add("अमित")
visitors.add("राज")    # पहले से सेट में है, चुप्पी से ignore किया गया
visitors.add("प्रिया")

print(f"अद्वितीय visitors: {len(visitors)}")
print(f"राज visited: {'राज' in visitors}")
print(f"दिव्य visited:  {'दिव्य' in visitors}")

यह track करने के लिए सेट का उपयोग करें कि क्या पहले से process किया गया है और बचे हुए काम को compute करें:

python
already_processed = {"report_jan.csv", "report_feb.csv"}
all_files = {"report_jan.csv", "report_feb.csv", "report_mar.csv", "report_apr.csv"}

to_process = all_files - already_processed
print(f"Files to process: {sorted(to_process)}")

for filename in sorted(to_process):
    print(f"Processing {filename}...")
    already_processed.add(filename)

print(f"Done. Total processed: {len(already_processed)}")

constant lookup tables के लिए frozenset का उपयोग करें और O(1) membership testing को सेट algebra के साथ demonstrate करें:

python
ALLOWED_METHODS = frozenset({"GET", "POST", "PUT", "PATCH", "DELETE"})
SAFE_METHODS = frozenset({"GET", "HEAD", "OPTIONS"})

# frozenset पर सेट algebra एक नियमित सेट return करता है
unsafe_allowed = ALLOWED_METHODS - SAFE_METHODS
print(f"Non-safe allowed methods: {unsafe_allowed}")

# frozenset hashable है, इसलिए इसे एक सेट के अंदर store किया जा सकता है (एक सादा सेट नहीं कर सकता)
method_groups = {
    frozenset({"GET", "HEAD", "OPTIONS"}),
    frozenset({"POST", "PUT", "PATCH"}),
    frozenset({"DELETE"}),
}
print(f"Method groups: {len(method_groups)}")

method = "POST"
print(f"Allowed: {method in ALLOWED_METHODS}")
print(f"Safe:    {method in SAFE_METHODS}")

frozenset O(1) lookup carry करता है और कहीं भी store किया जा सकता है एक hashable प्रकार की आवश्यकता है। दो frozenset objects पर सेट algebra एक सादा set return करता है; इसे immutable रखने के लिए परिणाम को frozenset() में wrap करें।