टपल और सेट

आप लिस्ट को जानते हैं। Python के पास दो और कलेक्शन प्रकार हैं जो लिस्ट नहीं कर सकते। टपल मानों का एक निश्चित समूह रखते हैं जो कभी नहीं बदलेगा। सेट केवल अद्वितीय मान रखते हैं और आपको तुरंत सदस्यता जाँचने देते हैं चाहे कलेक्शन कितना भी बड़ा हो।
टपल
एक टपल मानों का एक क्रमबद्ध समूह है जिसे आप बनाने के बाद नहीं बदल सकते। कोष्ठक एक टपल को परिभाषित करते हैं, लेकिन वे वैकल्पिक हैं। अल्पविराम वह है जो वास्तव में एक टपल बनाता है। एक एकल-आइटम टपल को अनुगामी अल्पविराम की आवश्यकता होती है।
point = (10, 20)
rgb = (255, 128, 0)
dimensions = (1920, 1080)
single = (42,) # एकल-आइटम टपल के लिए अनुगामी अल्पविराम आवश्यक है
also_tuple = 42, 99 # कोष्ठक वैकल्पिक हैं; अल्पविराम इसे टपल बनाता हैअनुक्रमण द्वारा एक्सेस बिल्कुल लिस्ट की तरह काम करता है। किसी आइटम को बदलने का प्रयास TypeError उठाता है:
point = (10, 20)
point[0] # 10
point[1] # 20
point[-1] # 20
point[0] = 99 # TypeError: 'tuple' object does not support item assignment(42,) को उस अकेले अनुगामी अल्पविराम की आवश्यकता है। किसी आइटम को पुनः असाइन करने का प्रयास करें और आपको TypeError मिलता है, और वह locked-in महसूस बिल्कुल वही है कि आप टपल क्यों चुनेंगे। कब टपल का उपयोग करें
टपल का उपयोग करें जब आपके पास संबंधित मानों का एक छोटा समूह हो जो एक साथ हो और नहीं बदलेगा। निर्देशांक (x, y), एक रंग (r, g, b), एक नाम-स्कोर जोड़ी ("अमित", 87)। निश्चित संरचना किसी को भी कोड पढ़ने के लिए संकेत देती है कि यह समूह एकल इकाई के रूप में माना जाता है।
(r, g, b) रंग, एक नाम-और-स्कोर जोड़ी। क्योंकि टपल hashable हैं, आप एक को डिक्शनरी की के रूप में भी उपयोग कर सकते हैं। एक लिस्ट ऐसा नहीं कर सकती, जो पहली बार लोगों को परेशान करता है जब वे कोशिश करते हैं। locations = {}
locations[(40, -74)] = "दिल्ली" # डिक्शनरी की के रूप में टपल, काम करता है
locations[[40, -74]] = "दिल्ली" # डिक्शनरी की के रूप में लिस्ट, TypeErrorUnpacking
Unpacking एक टपल से मानों को निकालता है और प्रत्येक को एक एकल पंक्ति में अपने नाम को असाइन करता है। नामों की संख्या मानों की संख्या से मेल खानी चाहिए। बचे हुए किसी भी आइटम को एक लिस्ट में कैप्चर करने के लिए * का उपयोग करें।
x, y = point। नामों की संख्या मानों की संख्या से मेल खानी चाहिए, जब तक कि आप बचे हुए को scoop करने के लिए *rest जोड़ें। यह मेरे लिए क्लिक हुआ जिस दिन मैंने हर जगह point[0] और point[1] लिखना बंद किया। 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 नाम प्राप्त करते हैं।
point.x लिखते हैं point[0] x है यह याद रखने की बजाय। यह अभी भी पूरी तरह immutable है और हर दूसरे तरीके से एक नियमित टपल की तरह काम करता है। कोड पढ़ने वाले आपके भविष्य के आप नामों के लिए आपको धन्यवाद देंगे। namedtuple standard library में रहता है, इसलिए इसे पहले एक import की आवश्यकता होती है: from collections import namedtuple। Imports को पूर्ण उपचार Modules अध्याय में मिलता है।
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() तक पहुँचें, क्योंकि {} secretly एक empty dict है। वह आखिरी बिट लगभग सबको पकड़ता है। tags = {"python", "beginner", "tutorial"}
numbers = {1, 2, 3, 4, 5}
empty = set() # नहीं {} (वह एक empty dict है)एक ही मान को दो बार जोड़ने से सेट नहीं बदलता:
tags.add("python") # tags unchanged है, "python" पहले से इसमें हैकब सेट का उपयोग करें
सेट तीन चीजों के लिए सही tool हैं: एक लिस्ट से duplicates को हटाना, जल्दी जाँचना कि क्या कुछ एक बड़े कलेक्शन में है, और दो समूहों की तुलना करना कि वे क्या साझा करते हैं या अलग करते हैं।
# एक लिस्ट से duplicates को हटाएँ
raw = ["cat", "dog", "cat", "bird", "dog", "cat"]
unique = list(set(raw)) # ["cat", "dog", "bird"] (क्रम guaranteed नहीं है)# तेज़ 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 समकक्ष है।
| union है (किसी में), & intersection है (दोनों में), - difference है (एक में लेकिन दूसरे में नहीं), और ^ symmetric difference है (एक में लेकिन दोनों में नहीं)। प्रत्येक का एक spelled-out method भी है जैसे .union() अगर आप symbols की बजाय words को prefer करते हैं। 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() एक आइटम को put करता है, .update() एक लिस्ट या अन्य iterable से एक पूरे batch को जोड़ता है। removal को straighten करने के लिए जोड़ी: .remove() error करता है अगर आइटम नहीं है, जबकि .discard() shrug करता है और move on करता है। जब आप सुनिश्चित नहीं हैं यह सेट में है, .discard() आपको एक stray error बचाता है। 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 किया जा सकता है।
valid_statuses = frozenset({"active", "paused", "deleted"})
valid_statuses.add("archived") # AttributeError, frozenset immutable हैसही कलेक्शन को चुनना
चार प्रकार, प्रत्येक एक स्पष्ट role के साथ। पूछें कि आपको डेटा के साथ क्या करने की आवश्यकता है और सही विकल्प आमतौर पर अनुसरण करता है।
| list | tuple | set | dict | |
|---|---|---|---|---|
| Ordered | हाँ | हाँ | नहीं | हाँ (insertion order) |
| Mutable | हाँ | नहीं | हाँ | हाँ |
| Duplicates | हाँ | हाँ | नहीं | नहीं (keys) |
| Access by | अनुक्रमण | अनुक्रमण | n/a | की |
| Use when | Ordered, changeable अनुक्रम | निश्चित record | अद्वितीय मान, तेज़ membership | key-value lookup |
एक quick decision rule:
- कुछ नाम से look up करने की जरूरत है? → dict
- एक ordered कलेक्शन चाहिए जिसे आप modify करेंगे? → list
- संबंधित मानों का एक निश्चित समूह है? → tuple
- अद्वितीय मान या तेज़ membership tests चाहिए? → set
व्यवहार में
निश्चित records store करने के लिए टपल और unique values को track करने के लिए सेट का उपयोग:
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}")
