एक list क्रम में रखे एलिमेंट का परिवर्तनीय संग्रह है।
ज़्यादातर संग्रहों की तरह (बिल्ट-इन tuple, dict और set देखिए), ऐरे किसी भी डेटा टाइप (या एक से अधिक डेटा टाइप) का रेफरेंस रख सकते हैं, जिनमें दूसरे ऐरे भी शामिल हैं।
किसी भी सीक्वेंस की तरह, एलिमेंट तक बाईं ओर से 0-based index संख्या और दाईं ओर से -1-based index के ज़रिए पहुँचा जा सकता है।
ऐरे को पूरी तरह या कुछ हिस्सों में स्लाइस नोटेशन या <list>.copy() के ज़रिए कॉपी किया जा सकता है।
ऐरे सामान्य और परिवर्तनीय दोनों तरह के सीक्वेंस ऑपरेशन सपोर्ट करते हैं, जैसे min()/max(), <list>.index(), <list>.append() और <list>.reverse()।
ऐरे के एलिमेंट पर for item in <list> रचना का इस्तेमाल करके इटरेशन किया जा सकता है।
जब एलिमेंट का इंडेक्स और एलिमेंट की वैल्यू दोनों की ज़रूरत हो, तब for index, item in enumerate(<list>) इस्तेमाल किया जा सकता है।
अंदर से lists को डायनैमिक ऐरे के रूप में लागू किया जाता है, जो Java के ArrayList टाइप जैसा होता है। इसका इस्तेमाल अक्सर अज्ञात लंबाई वाले समान डेटा (स्ट्रिंग, संख्याएँ, सेट आदि) के समूह संग्रहीत करने के लिए किया जाता है।
ऐरे बहुत लचीली और उपयोगी डेटा संरचनाएँ हैं, और Python में कई बिल्ट-इन मेथड तथा ऑपरेशन अपने आउटपुट के रूप में ऐरे देते हैं।
एक list को चौकोर [] ब्रैकेट और एलिमेंट के बीच कॉमा के साथ लिटरल के रूप में घोषित किया जा सकता है:
>>> no_elements = []
>>> no_elements
[]
>>> one_element = ["Guava"]
>>> one_element
['Guava']
>>> elements_separated_with_commas = ["Parrot", "Bird", 334782]
>>> elements_separated_with_commas
['Parrot', 'Bird', 334782]
पढ़ने में आसानी के लिए, जब किसी list में बहुत सारे एलिमेंट या नेस्टेड डेटा स्ट्रक्चर हों, तब लाइन ब्रेक इस्तेमाल किए जा सकते हैं:
>>> lots_of_entries = [
"Rose",
"Sunflower",
"Poppy",
"Pansy",
"Tulip",
"Fuchsia",
"Cyclamen",
"Lavender"
]
>>> lots_of_entries
['Rose', 'Sunflower', 'Poppy', 'Pansy', 'Tulip', 'Fuchsia', 'Cyclamen', 'Lavender']
# Each data structure is on its own line to help clarify what they are.
>>> nested_data_structures = [
{"fish": "gold", "monkey": "brown", "parrot": "grey"},
("fish", "mammal", "bird"),
['water', 'jungle', 'sky']
]
>>> nested_data_structures
[{'fish': 'gold', 'monkey': 'brown', 'parrot': 'grey'}, ('fish', 'mammal', 'bird'), ['water', 'jungle', 'sky']]
list() कंस्ट्रक्टर को खाली या आर्गुमेंट के रूप में किसी इटरेबल के साथ इस्तेमाल किया जा सकता है।
कंस्ट्रक्टर इटरेबल के एलिमेंट पर एक-एक करके चलता है और उन्हें क्रम में list में जोड़ देता है:
>>> no_elements = list()
>>> no_elements
[]
# The tuple is unpacked and each element is added.
>>> multiple_elements_from_tuple = list(("Parrot", "Bird", 334782))
>>> multiple_elements_from_tuple
['Parrot', 'Bird', 334782]
# The set is unpacked and each element is added.
>>> multiple_elements_from_set = list({2, 3, 5, 7, 11})
>>> multiple_elements_from_set
[2, 3, 5, 7, 11]
किसी string या dict के साथ list कंस्ट्रक्टर इस्तेमाल करने पर नतीजे चौंकाने वाले हो सकते हैं:
# String elements (Unicode code points) are iterated through and added *individually*.
>>> multiple_elements_string = list("Timbuktu")
>>> multiple_elements_string
['T', 'i', 'm', 'b', 'u', 'k', 't', 'u']
# Unicode separators and positioning code points are also added *individually*.
>>> multiple_code_points_string = list('अभ्यास')
>>> multiple_code_points_string
['अ', 'भ', '्', 'य', 'ा', 'स']
# The iteration default for dictionaries is over the keys, so only key data is inserted into the list.
>>> source_data = {"fish": "gold", "monkey": "brown"}
>>> multiple_elements_dict_1 = list(source_data)
['fish', 'monkey']
चूँकि list कंस्ट्रक्टर आर्गुमेंट के रूप में सिर्फ़ इटरेबल (या कुछ नहीं) लेता है, जो ऑब्जेक्ट इटरेबल नहीं हैं वे टाइप एरर देंगे।
इसलिए एक एलिमेंट वाला list लिटरल तरीके से बनाना कहीं ज़्यादा आसान है।
# Numbers are not iterable, and so attempting to create a list with a number passed to the constructor fails.
>>> one_element = list(16)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
# Tuples *are* iterable, so passing a one-element tuple to the constructor does work, but it's awkward
>>> one_element_from_iterable = list((16,))
>>> one_element_from_iterable
[16]
ऐरे के अंदर के एलिमेंट (और दूसरे सीक्वेंस टाइप str तथा tuple के एलिमेंट भी) तक 0-based index और ब्रैकेट नोटेशन के ज़रिए पहुँचा जा सकता है।
इंडेक्स left से right की ओर (शून्य से शुरू) या right से left की ओर (-1 से शुरू) हो सकते हैं।
| बाईं ओर से इंडेक्स ⟹ |
|
⟸ दाईं ओर से इंडेक्स |
>>> breakfast_foods = ["Oatmeal", "Fruit Salad", "Eggs", "Toast"]
# Oatmeal is at index 0 or index -4.
>>> breakfast_foods[0]
'Oatmeal'
>>> breakfast_foods[-4]
'Oatmeal'
# Eggs are at index -2 or 2
>>> breakfast_foods[-2]
'Eggs'
>>> breakfast_foods[2]
'Eggs'
# Toast is at -1
>>> breakfast_foods[-1]
'Toast'
किसी list के अंदर एलिमेंट के एक हिस्से तक स्लाइस नोटेशन (<list>[start:stop]) के ज़रिए पहुँचा जा सकता है।
किसी स्लाइस को index स्थिति पर मौजूद एलिमेंट के क्रम के रूप में परिभाषित किया जाता है, जहाँ start <= index < stop हो।
स्लाइसिंग "स्लाइस किए गए" एलिमेंट की एक कॉपी लौटाती है और मूल list को नहीं बदलती।
list के एलिमेंट को "छोड़ने" या फ़िल्टर करने के लिए [start:stop:step] में step पैरामीटर भी इस्तेमाल किया जा सकता है (उदाहरण के लिए, step का मान 2 रेंज में हर दूसरा एलिमेंट चुन लेगा):
>>> colors = ["Red", "Purple", "Green", "Yellow", "Orange", "Pink", "Blue", "Grey"]
# If there is no step parameter, the step is assumed to be 1.
>>> middle_colors = colors[2:6]
>>> middle_colors
['Green', 'Yellow', 'Orange', 'Pink']
# If the start or stop parameters are omitted, the slice will
# start at index zero, and will stop at the end of the list.
>>> primary_colors = colors[::3]
>>> primary_colors
['Red', 'Yellow', 'Blue']
किसी ऐरे पर बिल्ट-इन sum() फंक्शन इस्तेमाल करने से ऐरे की सभी संख्याओं का जोड़ लौटता है:
>>> number_list = [1, 2, 3, 4]
>>> sum(number_list)
10
आप len() फंक्शन इस्तेमाल करके ऐरे की लंबाई भी पता कर सकते हैं:
>>> long_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"]
>>> len(long_list)
10
ऐरे को कई तरीकों से जोड़ा भी जा सकता है:
# Using the plus + operator unpacks each list and creates a new list, but it is not efficient.
>>> new_via_concatenate = ["George", 5] + ["cat", "Tabby"]
>>> new_via_concatenate
['George', 5, 'cat', 'Tabby']
# Likewise, using the multiplication operator * is the equivalent of using + n times.
>>> first_group = ["cat", "dog", "elephant"]
>>> multiplied_group = first_group * 3
>>> multiplied_group
['cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant']
ऐरे एक इटरेटर देते हैं, और इन पर दूसरे सीक्वेंस टाइप की तरह ही लूप चलाया जा सकता है।
# Looping through the list and printing out each element.
>>> colors = ["Orange", "Green", "Grey", "Blue"]
>>> for item in colors:
... print(item)
...
Orange
Green
Grey
Blue
loops और iterators की अधिक गहराई से व्याख्या के लिए, loops कॉन्सेप्ट पूरा कीजिए।
Elyse अपनी आने वाली Vegas यात्रा में पोकर (और दूसरे कार्ड गेम) खेलने को लेकर बहुत उत्साहित है। वह "खुद पर नज़र रखने" को बहुत पसंद करती है, इसलिए वह कुछ छोटे-छोटे फंक्शन बनाना चाहती है जो उसे ट्रैकिंग के कामों में मदद करें, और उसने इन पर सोचने में आपकी मदद माँगी है।
Elyse को पोकर खास तौर पर बहुत पसंद है, और वह यह ट्रैक करना चाहती है कि वह कितने राउंड खेलती है, और वे कौन-से राउंड हैं। हर राउंड का अपना नंबर होता है, और हर टेबल पर वर्तमान में खेला जा रहा राउंड नंबर दिखाई देता है। Elyse एक टेबल चुनती है और अपना पहला राउंड खेलने बैठ जाती है। वह तीन राउंड खेलने की योजना बनाती है।
एक फंक्शन get_rounds(<round_number>) बनाइए जो वर्तमान राउंड नंबर लेता है और उस राउंड तथा उसके बाद आने वाले अगले दो राउंड वाला एक list लौटाता है:
>>> get_rounds(27)
[27, 28, 29]
Elyse ने पहली टेबल पर कुछ राउंड खेले, फिर कुछ देर आराम किया और दूसरी टेबल पर कुछ और राउंड खेले ... लेकिन अंत में उसके पास हर टेबल के लिए एक अलग ऐरे बन गया! वह दोनों ऐरे को एक साथ जोड़ना चाहती है, ताकि वह पोकर के सारे राउंड एक ही जगह ट्रैक कर सके।
एक फंक्शन concatenate_rounds(<rounds_1>, <rounds_2>) बनाइए जो दो ऐरे लेता है और एक ही list लौटाता है, जिसमें पहले list के सारे राउंड हों और उसके बाद दूसरे list के सारे राउंड हों:
>>> concatenate_rounds([27, 28, 29], [35, 36])
[27, 28, 29, 35, 36]
पोकर के कुछ पिछले राउंड की बात करते हुए एक और खिलाड़ी कहता है कि उनमें से दो राउंड कितने समान तरीके से खेले गए। Elyse को पक्का नहीं पता कि उसने वे राउंड खेले थे या नहीं।
एक फंक्शन list_contains_round(<rounds>, <round_number>) बनाइए जो दो आर्गुमेंट लेता है: खेले गए राउंड का एक ऐरे और एक राउंड नंबर। अगर वह राउंड खेले गए राउंड के ऐरे में है तो फंक्शन True लौटाएगा, और अगर नहीं है तो False:
>>> list_contains_round([27, 28, 29, 35, 36], 29)
True
>>> list_contains_round([27, 28, 29, 35, 36], 30)
False
Elyse Black Joe नाम का एक नया गेम आज़माना चाहती है। यह Black Jack जैसा है, जिसमें आपका लक्ष्य यह होता है कि आपके हैंड के कार्ड मिलकर एक तय वैल्यू तक पहुँच जाएँ, लेकिन Black Joe में लक्ष्य यह है कि कार्ड की वैल्यू का औसत 7 हो जाए। औसत निकालने के लिए सारे कार्ड की वैल्यू जोड़िए और फिर उस जोड़ को हैंड में मौजूद कार्ड की संख्या से भाग दीजिए।
एक फंक्शन card_average(<hand>) बनाइए जो Black Joe के एक हैंड की औसत वैल्यू लौटाएगा।
>>> card_average([5, 6, 7])
6.0
Black Joe में तेज़ी ज़रूरी है। Elyse औसत निकालने का कोई और तेज़ तरीका ढूँढने की कोशिश करने वाली है।
उसने औसत जैसी संख्या पाने के दो तरीके सोचे हैं:
फंक्शन approx_average_is_average(<hand>) बनाइए, जिसे hand दिया जाता है, जो आपके हैंड के कार्ड की वैल्यू रखने वाला एक ऐरे है।
अगर ऊपर बताए गए तरीकों में से कोई एक or दोनों वास्तविक औसत के बराबर संख्या देते हैं, तो True लौटाइए।
ध्यान दें: माध्यिका ढूँढना आसान बनाने के लिए सभी हैंड की लंबाई विषम होती है।
>>> approx_average_is_average([1, 2, 3])
True
>>> approx_average_is_average([2, 3, 4, 8, 8])
True
>>> approx_average_is_average([1, 2, 3, 5, 9])
False
अपने औसत वाले प्रयोग के नतीजों से उत्सुक होकर Elyse सोच रही है कि क्या सम इंडेक्स वाले कार्ड का औसत और विषम इंडेक्स वाले कार्ड का औसत एक ही नतीजा देगा। एक और टेस्ट फंक्शन बनाने का समय!
एक फंक्शन average_even_is_average_odd(<hand>) बनाइए जो एक बूलियन लौटाता है, जो बताता है कि सम इंडेक्स वाले कार्ड का औसत विषम इंडेक्स वाले कार्ड के औसत के बराबर है या नहीं।
>>> average_even_is_average_odd([1, 2, 3])
True
>>> average_even_is_average_odd([1, 2, 3, 4])
False
Black Joe में हर 11वाँ हैंड एक बोनस हैंड होता है, जिसका एक बोनस नियम है: अगर आपके द्वारा खींचा गया अंतिम कार्ड Jack है, तो उसकी वैल्यू दोगुनी कर दीजिए।
एक फंक्शन maybe_double_last(<hand>) बनाइए जो एक हैंड लेता है और जाँचता है कि अंतिम कार्ड Jack (11) है या नहीं। अगर अंतिम कार्ड Jack (11) है, तो हैंड लौटाने से पहले उसकी वैल्यू दोगुनी कर दीजिए।
>>> hand = [5, 9, 11]
>>> maybe_double_last(hand)
[5, 9, 22]
>>> hand = [5, 9, 10]
>>> maybe_double_last(hand)
[5, 9, 10]
Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।