पायथन में एक सरणी की घोषणा कैसे करें?


490

मैं पायथन में एक सरणी की घोषणा कैसे करूं ?

मुझे दस्तावेज़ में सरणियों का कोई संदर्भ नहीं मिल रहा है।


121
कुछ अथाह कारण के लिए, पायथन ने सरणियों को "सूचियाँ" कहा। "हर कोई जानता है-क्या-यह-यह-तथाकथित-हम-जा रहे हैं-कॉल-टू-इट-इट-समथिंग" स्कूल ऑफ़ लैंग्वेज डिज़ाइन। यह नाम का एक विशेष रूप से बुरा विकल्प है, क्योंकि यह एक सरणी के बजाय एक लिंक की गई सूची की तरह दिखता है।
ग्लेन मेनार्ड

42
@ ग्लेन मेनार्ड: शायद इसलिए कि सी-जैसी भाषाओं में एरे को निश्चित लंबाई दी जाती है जबकि पायथन सूची में नहीं हैं। यह C ++ में STL वेक्टर या जावा में ArrayList की तरह है।
MAK

128
इसे एक सूची कहा जाता है, क्योंकि यह एक सूची है। [ए (), 1, 'फू', 'उओगो', 67 एल, 5.6]। एक सूचि। एक सरणी "कंप्यूटर मेमोरी में समान रूप से स्थानिक पते पर वस्तुओं की व्यवस्था" (विकिपीडिया) है।
लेनार्ट रेगेब्र

35
सार्वभौमिक रूप से समझे गए शब्द "सरणी" के बारे में कुछ भी निश्चित लंबाई या सामग्री के बारे में कुछ भी नहीं बताता है; वे सी की विशेष रूप से सरणियों के कार्यान्वयन की सीमाएं हैं। पायथन सूचियां समान रूप से दूरी पर हैं (वस्तुओं की ओर संकेत करती हैं, आंतरिक रूप से), या फिर __getitem__O (1) नहीं होगा।
ग्लेन मेनार्ड

24
@ ग्लेन, en.wikipedia.org/wiki/Array_data_structure से: "एक सरणी डेटा संरचना के तत्वों को समान आकार की आवश्यकता है" (पायथन की सरणियों के लिए सही, पायनियर सूचियों के लिए सत्य नहीं) और "वैध सूचकांक ट्यूपल का सेट और" तत्वों का पता (और इसलिए तत्व को संबोधित करने वाला सूत्र) आमतौर पर तय किया जाता है जबकि सरणी उपयोग में है "(या तो सूची या सरणी के लिए पायथन में सच नहीं है)।
एलेक्स मार्टेली

जवाबों:


358
variable = []

अब variableएक खाली सूची * का संदर्भ देता है ।

बेशक यह एक घोषणा है, घोषणा नहीं। पायथन में कहने का कोई तरीका नहीं है "इस चर को किसी सूची के अलावा किसी भी चीज़ का उल्लेख नहीं करना चाहिए", क्योंकि पायथन गतिशील रूप से टाइप किया गया है।


* डिफ़ॉल्ट अंतर्निहित पायथन प्रकार को एक सूची कहा जाता है , न कि एक सरणी। यह मनमाना लंबाई का एक ऑर्डर किया गया कंटेनर है जो वस्तुओं के विषम संग्रह को पकड़ सकता है (उनके प्रकार मायने नहीं रखते हैं और स्वतंत्र रूप से मिश्रित हो सकते हैं)। यह arrayमॉड्यूल के साथ भ्रमित नहीं होना चाहिए , जो सी arrayप्रकार के करीब एक प्रकार प्रदान करता है ; सामग्री समरूप (सभी प्रकार की) होनी चाहिए, लेकिन लंबाई अभी भी गतिशील है।


11
क्या यह ऐरे की सामग्री को इनिशियलाइज़ करना संभव होगा, जैसा कि जावास्क्रिप्ट में है? (उदा।, के रूप में variable = ["Hi", "Hello"];?)
एंडरसन ग्रीन

6
@AndersonGreen हाँ।
10

3
आप एक बहुआयामी सरणी की घोषणा कैसे करेंगे, तो (जैसे, एक 2D सरणी?)
एंडरसन ग्रीन

7
@AndersonGreen जैसा कि मैंने कहा कि पायथन में एक चर घोषणा के रूप में ऐसी कोई बात नहीं है। आप एक खाली सूची लेकर और उसके अंदर अन्य सूचियाँ डालकर एक बहुआयामी सूची बनाएँगे या यदि सूची के आयामों को राइट-टाइम पर जाना जाता है, तो आप इसे इस तरह शाब्दिक रूप में लिख सकते हैं my_2x2_list = [[a, b], [c, d]]:। इसके लिए आपको बहु-आयामी सरणियों की आवश्यकता होती है, इस पर निर्भर करते हुए, आप उपयोग करने पर भी विचार कर सकते हैं numpy, जो बहु-आयामी, सजातीय, अनबॉक्स किए गए सरणियों के लिए सरणी प्रकार को परिभाषित करता है जो कि जहां लागू हो वहां बहुत अधिक कुशल हो सकते हैं, इसलिए वे संख्यात्मक अभिकलन के लिए बेहतर हैं।
sepp2k

1
@IfanIqbal हाँ, यदि इसमें कम से कम एक तत्व शामिल है, तो आप कर सकते हैं।
sepp2k

136

यह पाइथन में आश्चर्यजनक रूप से जटिल विषय है।

व्यावहारिक उत्तर

एरे को कक्षा द्वारा दर्शाया जाता है list( संदर्भ देखें और उन्हें जनरेटर के साथ न मिलाएं )।

उपयोग के उदाहरण देखें:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

सैद्धांतिक उत्तर

हुड पायथन के तहत listएक वास्तविक सरणी के लिए एक आवरण है जिसमें आइटम के संदर्भ शामिल हैं। इसके अलावा, अंतर्निहित सरणी कुछ अतिरिक्त स्थान के साथ बनाई गई है।

इस के परिणाम हैं:

  • यादृच्छिक पहुँच वास्तव में सस्ती है ( arr[6653]उसी के समान है arr[0])
  • append ऑपरेशन कुछ अतिरिक्त जगह पर 'मुफ्त में' होता है
  • insert ऑपरेशन महंगा है

संचालन जटिलता की इस भयानक तालिका की जाँच करें ।

इसके अलावा, कृपया इस चित्र को देखें, जहाँ मैंने सरणी, संदर्भों और लिंक की गई सूची के बीच सबसे महत्वपूर्ण अंतर दिखाने की कोशिश की है: arrays, arrays हर जगह


5
बस जोड़ने के लिए, अजगर में सरणियों को काटने का एक बहुत अच्छा तरीका है: [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]परिणाम के लिए होगा[2, 3, 4, 5, 6, 7]
एंटोन पुरीन

2
मैं समय-समय पर इस पोस्ट के लिए कुछ डाउन वोट देखता हूं। यह बहुत अच्छा होगा अगर कोई एक शब्द पोस्ट कर सकता है। धन्यवाद।
एंटोन पुरिन

2
आप असली एमवीपी। उचित प्रोग्रामिंग निर्णय लेने के लिए 'सूची' के वास्तविक चुने हुए डिजाइन को जानना आवश्यक है। मूल रूप से यह C ++ में 'वेक्टर' की तरह है। धन्यवाद!
नेक्रो

यह कुछ महान स्पष्टीकरण के साथ कुछ वास्तविक लंबा उत्तर है!
अहमद

: मैं तुलना के लिए व्यावहारिक अंकन जोड़ सकते हैं, उदाहरण के लिए a == b[:2]रिटर्न यह सच है, तो के पहले 2 तत्वों सरणी के मूल्यों के बराबर होती है एक
ब्रूनो एल

124

आप वास्तव में चीजों की घोषणा नहीं करते हैं, लेकिन यह है कि आप पायथन में एक सरणी कैसे बनाते हैं:

from array import array
intarray = array('i')

अधिक जानकारी के लिए सरणी मॉड्यूल देखें: http://docs.python.org/library/array.html

अब संभव है कि आप एक सरणी नहीं चाहते हैं, लेकिन एक सूची है, लेकिन दूसरों ने जवाब दिया है कि पहले से ही। :)


10
यह मजाकिया है, लेकिन वास्तव में "शुरुआती" टैग किए गए सवाल का अच्छा जवाब नहीं है। बस इसे स्पष्ट करने के लिए: पायथन में आप आमतौर पर एक डेटा प्रकार का उपयोग करते हैं जिसे ए कहा जाता है list। पायथन में एक विशेष-उद्देश्य डेटा प्रकार होता है जिसे arrayC सरणी की तरह कहा जाता है और इसका बहुत कम उपयोग किया जाता है।
स्टीवेहा

63
नहीं, लेकिन बाकी सभी ने पहले से ही एक सूची का उपयोग किया था। मैंने सोचा कि यह एक अच्छा जवाब होगा कि सरणियाँ भी हैं।
लेनार्ट रेगेब्र

8
इस जवाब के लिए सुपर पागल सहारा। मैं वर्षों से पायथन में प्रोग्रामिंग कर रहा हूं और हाल ही में महसूस किया गया था कि एक वास्तविक पायथन एरे ऑब्जेक्ट था जो सूची ऑब्जेक्ट्स से अलग है। जबकि डेटा संरचना बहुत समान है, सरणियाँ सीमा देती हैं कि सरणी किस प्रकार की वस्तुओं को पकड़ सकती है। शानदार जवाब @LennartRegebro!
जोश ब्राउन

4
यह सही उत्तर होना चाहिए सूची और Arrays दो अलग-अलग चीजें हैं @LennartRegebro धन्यवाद
मीना गेब्रियल

एक विशिष्ट कारण है जिसे आप सूचियों के बजाय सरणियों का उपयोग करना चाह सकते हैं। विशेष रूप से, यदि आपके पास संख्याओं से भरा मायार्रे नामक एक सरणी है, तो आप इसके खिलाफ गणितीय संचालन कर सकते हैं, और उन कार्यों को इसके अंदर सभी वस्तुओं पर लागू किया जाता है। इसलिए, यदि आप myarray / 3 को निष्पादित करते हैं, तो अंदर की प्रत्येक संख्या 3 से विभाजित हो जाती है। यदि आप एक सूची के साथ एक ही काम करने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी। इसलिए, संख्याओं के बड़े डेटासेट के लिए सरणियाँ अधिक कुशल हैं।
मैथ्यू

66

मुझे लगता है कि आप (मतलब) पहले से भरी 30 कोशिकाओं के साथ एक सूची चाहते हैं। इसलिए

   f = []

   for i in range(30):
       f.append(0)

एक उदाहरण जहां इसका उपयोग किया जा सकता है, वह फिबोनाची अनुक्रम में है। प्रॉजेक्ट 2 को प्रोजेक्ट यूलर में देखें


96
यह एक सूची को शुरू करने का एक बल्कि बारोक तरीका है। f = [0] * 30इसके बजाय कोशिश करें ।
जॉन मैकिन

@Slehar awer से एक = श्रेणी (10) से अधिक नहीं है? अजगर से प्यार करो, यह वाक्यविन्यास है और यह ज़ेन है।
m3nda

@ erm3nda nope: $ python3 Python 3.4.2 [...] >>> a = श्रेणी (10) >>> प्रिंट (a) श्रेणी (0, 10) >>>
arp

37

इस तरह से:

my_array = [1, 'rebecca', 'allard', 15]

4
चूँकि यह एक अजगर की सरणी नहीं बल्कि अजगर की सूची है, इसलिए इसे "my_list" कहना कम भ्रामक नहीं होगा?
एस्प एस्प

4
यह एक सूची बनाता है, एक सरणी नहीं। वे अलग-अलग हैं और अजगर में अलग-अलग गुण हैं। विशेष रूप से, आप किसी सरणी के विरुद्ध संख्यात्मक ऑपरेशन कर सकते हैं, लेकिन किसी सूची के विरुद्ध नहीं।
मैथ्यू

21

गणना के लिए, इस तरह से सुन्न सरणियों का उपयोग करें:

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

इन खस्ता सरणियों को डिस्क से (यहां तक ​​कि संपीड़ित) से बचाया और लोड किया जा सकता है और बड़ी मात्रा में तत्वों के साथ जटिल गणना सी-जैसे तेज हैं।

वैज्ञानिक वातावरण में ज्यादा इस्तेमाल किया जाता है। अधिक के लिए यहाँ देखें ।


17

JohnMachin की टिप्पणी का वास्तविक उत्तर होना चाहिए। अन्य सभी उत्तर मेरी राय में सिर्फ कामचोर हैं! इसलिए:

array=[0]*element_count

इस बात से सहमत। चर "सरणी" को कॉल करने के लिए सावधानी बरतने के अलावा, या शुद्धतावादी क्रोध प्राप्त करें। इसमें मैं यह भी जोड़ना चाहूंगा कि आप "बहुआयामी सरणियों" को समान रूप से बना सकते हैं:x=[[0] * 10] * 10
पीटर एस मैग्यूसन

17

कुछ योगदानों ने सुझाव दिया कि अजगर में सरणियों को सूचियों द्वारा दर्शाया जाता है। यह गलत है। पायथन में array()मानक पुस्तकालय मॉड्यूल का स्वतंत्र कार्यान्वयन है array " array.array()" इसलिए दोनों को भ्रमित करना गलत है। अजगर में सूचियां सूचीबद्ध हैं इसलिए उपयोग किए गए नामकरण के साथ सावधान रहें।

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

सूची और के बीच एक बहुत महत्वपूर्ण अंतर है array.array()। जबकि इन दोनों वस्तुओं को क्रमबद्ध किया जाता है, array.array () एक क्रमबद्ध सजातीय क्रम है जबकि एक सूची एक गैर-सजातीय अनुक्रम है।


16

आप पायथन में कुछ भी घोषित नहीं करते हैं। आप बस इसका इस्तेमाल करें। मेरा सुझाव है कि आप http://diveintopython.net जैसी किसी चीज़ से शुरुआत करें ।


2
कुछ बार आपको एक चर के प्रकार की घोषणा करनी चाहिए: यदि आप इसे नियंत्रण संरचना से पहले उपयोग नहीं करते हैं, तो यह नियंत्रण संरचना के बाहर मौजूद नहीं है और आप तब एक नया चर का निर्माण करेंगे। धारणा तब यह है कि चर एक अंतर है, जो संघर्ष करता है यदि आप इसे अधिक जटिल प्रकार के रूप में उपयोग करते हैं।
स्पष्ट

@Clearer हाँ, फ़ंक्शंस का उपयोग करना कभी-कभी इसे घोषित करने की आवश्यकता होती है, और फ़ंक्शंस का उपयोग करते समय कुछ ग्लोबल्स खेलने के लिए कभी-कभी फ़ंक्शंस पर बहुत अधिक तर्क लिखना नहीं चाहते हैं।
m3nda

यह सिर्फ कार्य नहीं है; एक साधारण यदि कथन आपको वही समस्या दे सकता है।
क्लियर

1
प्रोग्रामिंग सभी घोषित करने के बारे में है, कोई फर्क नहीं पड़ता कि आप किस भाषा का उपयोग करते हैं। टाइप
डिक्लेयरिंग

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
एड्रियन टॉमकिंस 21


11

Lennart के उत्तर में जोड़ने के लिए, इस तरह एक सरणी बनाई जा सकती है:

from array import array
float_array = array("f",values)

जहाँ मान टपल, सूची या np.array का रूप ले सकता है, लेकिन सरणी नहीं:

values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable

और आउटपुट अभी भी समान होगा:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

सूची की अधिकांश विधियाँ सरणी के साथ-साथ, आम लोगों के पॉप (), विस्तार (), और परिशिष्ट () के साथ काम करती हैं।

उत्तरों और टिप्पणियों को देखते हुए, ऐसा प्रतीत होता है कि सरणी डेटा संरचना इतनी लोकप्रिय नहीं है। हालांकि मुझे यह पसंद है, उसी तरह जैसे कोई सूची में टपल पसंद कर सकता है।

सरणी संरचना में सूची या np.array की तुलना में कठोर नियम हैं, और यह त्रुटियों को कम कर सकता है और डिबगिंग को आसान बना सकता है, खासकर जब संख्यात्मक डेटा के साथ काम कर रहा हो।

एक फ्लोट को एक इंट्रस्ट में डालने / जोड़ने का प्रयास एक TypeError को फेंक देगा:

values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

मानों को रखने के लिए जो सरणी रूप में पूर्णांक (उदाहरण के लिए सूचियों की सूची) के लिए होते हैं, इसलिए "टाइप टाइप: सूची सूचकांकों को पूर्णांक नहीं, फ्लोट होना चाहिए" को रोका जा सकता है, क्योंकि सरणियों को np.array और सूचियों के समान पुनरावृत्त किया जा सकता है:

int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
    sample.append(data[i])

वार्षिक रूप से, एक फ़्लोट एरे में एक इंट्रोड्यूस करने से इंट्रूमेंट फ़्लोट बन जाएगा, बिना किसी अपवाद के।

np.array अपनी प्रविष्टियों के लिए भी उसी डेटा प्रकार को बनाए रखता है, लेकिन एक त्रुटि देने के बजाय यह नई प्रविष्टियों (आमतौर पर डबल या स्ट्रेट) में फिट होने के लिए अपने डेटा प्रकार को बदल देगा:

import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
    print(type(i))
    # <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
    sample.append(data[i])
    # no problem here, but TypeError for the other two

यह असाइनमेंट के दौरान भी सच है। यदि डेटा प्रकार निर्दिष्ट किया गया है, तो np.array, जहाँ भी संभव होगा, प्रविष्टियों को उस डेटा प्रकार में बदल देगा:

int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>

या, संक्षेप में:

data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True

जबकि सरणी बस दे देंगे:

invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float

इस वजह से, प्रकार-विशिष्ट आदेशों के लिए np.array का उपयोग करना एक अच्छा विचार नहीं है। सरणी संरचना यहाँ उपयोगी है। सूची मानों के डेटा प्रकार को संरक्षित करती है।

और कुछ के लिए मैं बल्कि pesky पाते हैं: डेटा प्रकार सरणी () में पहले तर्क के रूप में निर्दिष्ट किया गया है, लेकिन (आमतौर पर) np.array () में दूसरा। : |

C का संबंध यहाँ बताया गया है: पायथन सूची बनाम ऐरे - कब उपयोग करना है?

मजा आ गया!

नोट: टाइप और बल्कि सख्त प्रकृति की प्रकृति पायथन के बजाय सी की ओर अधिक झुकती है, और डिजाइन द्वारा पायथन के पास अपने कार्यों में कई प्रकार-विशिष्ट बाधाएं नहीं हैं। इसकी अलोकप्रियता सहयोगात्मक कार्यों में एक सकारात्मक प्रतिक्रिया भी पैदा करती है, और इसकी जगह ज्यादातर फ़ाइल में x के लिए एक अतिरिक्त [int (x)] शामिल है। इसलिए यह सरणी के अस्तित्व को अनदेखा करने के लिए पूरी तरह से व्यवहार्य और उचित है। यह हम में से अधिकांश को किसी भी तरह से बाधित नहीं करना चाहिए। : डी


8

इस बारे में कैसा है...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6

6

अजगर उन्हें सूचियों कहता है । आप वर्ग कोष्ठक और अल्पविराम के साथ एक सूची शाब्दिक लिख सकते हैं:

>>> [6,28,496,8128]
[6, 28, 496, 8128]


4

मेरे पास स्ट्रिंग्स की एक सरणी थी और ट्रू के लिए शुरू की गई बूलियन की समान लंबाई के एक सरणी की आवश्यकता थी। यह जो मैंने किया है

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]

मैं यहां हूं क्योंकि मैं सी घोषणा चाहता था: int count[26]={0}; शायद एक बेहतर तरीका है लेकिन boolsऊपर से काम करने वाले इस संस्करण ने count=[0 for ii in range(26)]बाद में, मैंने इसे बदल दिया, count=[0]*26जो बेहतर लगता है।
user1683793

2

आप सूचियाँ बना सकते हैं और उन्हें सरणियों में परिवर्तित कर सकते हैं या आप संख्यात्मक मॉड्यूल का उपयोग करके सरणी बना सकते हैं। नीचे कुछ उदाहरण दिए गए हैं। Numpy भी बहुआयामी सरणियों के साथ काम करना आसान बनाता है।

import numpy as np
a = np.array([1, 2, 3, 4])

#For custom inputs
a = np.array([int(x) for x in input().split()])

आप इस सरणी को 2X2 मैट्रिक्स में भी फेरबदल कर सकते हैं, जो कि रिशेप फ़ंक्शन का उपयोग करके मैट्रिक्स के आयामों के रूप में इनपुट में लेता है।

mat = a.reshape(2, 2)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.