Lists + Tuples
क्रमबद्ध collections और ज़रूरी methods
यह क्यों मायने रखता है
ज़्यादातर समस्याओं के लिए lists डिफ़ॉल्ट container हैं। Tuples डेटा को सुरक्षित ढंग से ताला लगा देते हैं।
मूल विचार
Lists लचीली अलमारियाँ हैं; tuples बंद डिब्बे हैं। Tuples hashable होते हैं (dict keys, set सदस्य बन सकते हैं), lists नहीं।
आज़माकर देखिए
List की बुनियादी बातें — append, extend, slice, comprehension:
xs = [1, 2, 3]
xs.append(4) # in place
xs.extend([5, 6]) # in place
xs += [7] # in place too
print(xs)
# Comprehension — the Pythonic loop
squares = [x*x for x in xs if x % 2 == 0]
print(squares)
Tuples अपरिवर्तनीय होते हैं, unpacking का समर्थन करते हैं, और dict keys बन सकते हैं:
origin = (0, 0)
def move(point, dx, dy):
x, y = point # unpacking
return (x + dx, y + dy)
print(move(origin, 3, 4))
routes = { (0, 0): "home", (3, 4): "park" }
print(routes[(3, 4)])
Sorting — जगह पर बदलना बनाम नया लौटाना:
words = ["apple", "Banana", "cherry"]
print(sorted(words)) # case-sensitive
print(sorted(words, key=str.lower)) # case-insensitive
print(sorted(words, key=len, reverse=True))
# In place — returns None! (common bug)
words.sort()
print(words)
List methods (पूरी ज़रूरी सूची)
| Method | यह क्या करता है | उदाहरण |
| --- | --- | --- |
| append(x) | एक item जोड़ता है | nums.append(5) |
| extend(iter) | कई जोड़ता है | nums.extend([6,7]) |
| insert(i,x) | किसी index पर जोड़ता है | nums.insert(1, 42) |
| remove(x) | पहला मिलान हटाता है | nums.remove(2) |
| pop(i) | index से हटाता है | nums.pop() |
| clear() | सब हटाता है | nums.clear() |
| index(x) | स्थिति ढूँढता है | nums.index(3) |
| count(x) | मान गिनता है | nums.count(3) |
| sort() | जगह पर sort करता है | nums.sort() |
| reverse() | जगह पर उलटता है | nums.reverse() |
| copy() | shallow copy | nums.copy() |
List को stack / queue की तरह
एक list बढ़िया stack बनती है (अंत से append / pop)। तेज़ queue के लिए collections.deque की ओर बढ़िए — list के आगे से pop करना O(n) है:
from collections import deque
q = deque([1, 2, 3])
q.append(4) # enqueue
q.popleft() # dequeue — O(1)
Copy बनाम alias (महत्वपूर्ण)
a = [1, 2, 3]
b = a # alias — same list, mutations are shared
c = a.copy() # new list — independent
Nested list का जाल
[[0] * 3] * 3 उसी भीतरी row को तीन बार दोहराता है — एक को बदलने से सब बदल जाती हैं:
grid = [[0] * 3] * 3 # WRONG: shared rows
grid = [[0] * 3 for _ in range(3)] # correct: independent rows
झटपट जाँच
- प्र:
b = aक्या बनाता है? उ: एक alias (वही list)।
छोटे अभ्यास
sum()के बिना एक list का योग निकालिए।- किसी sorted list से डुप्लिकेट हटाइए (अवधारणा)।
- index 2 पर एक मान डालिए।
क्या करें और क्या न करें
- करें एकल items के लिए
appendऔर कई के लिएextendइस्तेमाल करें। - न करें यह न मानें कि
sort()एक नई list लौटाता है। - न करें
[[x]*n]*mसे nested lists न बनाएँ।
और गहराई में — complexity की झलक
- Index access: O(1)
- Append: O(1) amortized
- आगे insert/remove: O(n)
- सदस्यता (
x in lst): O(n)
आम ग़लतियाँ
- ग़लती: iterate करते समय किसी list को बदलना। समाधान: एक copy पर iterate करें या indices इस्तेमाल करें।
- ग़लती: alias को copy समझ बैठना। समाधान:
list(a)याa.copy()इस्तेमाल करें। - ग़लती:
new = nums.sort()Noneदेता है। समाधान:sorted(nums)इस्तेमाल करें।
मुख्य बातें
listmutable है;tupleअपरिवर्तनीय + hashable है।- Comprehensions,
for+appendसे तेज़ + ज़्यादा स्पष्ट हैं। sorted(x)एक नई list लौटाता है;x.sort()जगह पर बदलता है औरNoneलौटाता है।key=एक function लेता है:key=str.lower,key=len,key=lambda t: t[1]।b = aवही list साझा करता है; स्वतंत्र copy के लिएa.copy()इस्तेमाल करें।