2012-05-23 14 views
239

के साथ पायथन में एक खाली सूची बनाएं मैं एक खाली सूची (या जो भी सबसे अच्छा तरीका है) बनाना चाहता हूं जो 10 तत्वों को पकड़ सकता है।कुछ आकार

है कि मैं, उस सूची में मान निर्दिष्ट उदाहरण के लिए इस 0 से 9 तक प्रदर्शित करने के लिए माना जाता है चाहता हूँ के बाद:

s1 = list(); 
for i in range(0,9): 
    s1[i] = i 

print s1 

लेकिन जब मैं इस कोड को चलाने के लिए, यह एक त्रुटि उत्पन्न करता है या किसी अन्य के मामले में यह सिर्फ प्रदर्शित करता है [] (खाली)।

क्या कोई समझा सकता है क्यों?

+0

कारण है कि आप एक खाली सूची बनाने की जरूरत है? –

+0

संभव डुप्लिकेट [पायथन में तत्वों की एक ज्ञात संख्या में एक सूची आरंभ करना] (http://stackoverflow.com/questions/521674/initializing-a-list-to-a-known- number-of-elements-in- पायथन) – lumbric

+4

परिभाषा के अनुसार एक "खाली सूची" ('[]') शून्य तत्व है। जो आप स्पष्ट रूप से चाहते हैं वह 'कोई नहीं', '0', या' '' जैसे झूठे मूल्यों की एक सूची है। – dan04

उत्तर

404

आप lst[i] = something की तरह एक सूची में नहीं सौंप सकते। आपको परिशिष्ट का उपयोग करने की आवश्यकता है। lst.append(something)

(यदि आप एक शब्दकोश का उपयोग कर रहे थे तो आप असाइनमेंट नोटेशन का उपयोग कर सकते हैं)।

एक खाली सूची बनाना:

>>> l = [None] * 10 
>>> l 
[None, None, None, None, None, None, None, None, None, None] 

रेंज (एक्स) से [0, 1, 2, ... एक्स 1]

# 2.X only. Use list(range(10)) in 3.X. 
>>> l = range(10) 
>>> l 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

एक सूची बनाने के लिए एक समारोह का उपयोग बनाता है एक सूची:

>>> def display(): 
...  s1 = [] 
...  for i in range(9): # This is just to tell you how to create a list. 
...   s1.append(i) 
...  return s1 
... 
>>> print display() 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 

सूची समझ (वर्ग का उपयोग करना है, क्योंकि सीमा के लिए आप यह सब करने की ज़रूरत नहीं है, तो आप सिर्फ लौट सकते हैं range(0,9)):

>>> def display(): 
...  return [x**2 for x in range(9)] 
... 
>>> print display() 
[0, 1, 4, 9, 16, 25, 36, 49, 64] 
16

आप सूची में .append(element) कर सकते हैं, उदाहरण: s1.append(i)। जो आप वर्तमान में करने की कोशिश कर रहे हैं वह एक तत्व (s1[i]) तक पहुंच है जो मौजूद नहीं है।

69

ऐसा करें:

lst = [None] * 10 

ऊपर आकार 10 है, जहां प्रत्येक स्थिति None को आरंभ नहीं हो जाता की एक सूची का निर्माण करेगा। उसके बाद, आप इसमें तत्व जोड़ सकते हैं:

lst = [None] * 10 
for i in range(10): 
    lst[i] = i 

मान्य है, यह चीजों को करने का पाइथोनिक तरीका नहीं है। बेहतर ऐसा करते हैं:

lst = [] 
for i in range(10): 
    lst.append(i) 

या भी बेहतर, इस तरह उपयोग सूची comprehensions:

[i for i in range(10)] 
+0

इसके बारे में अन्य महान बात यह है कि आप डिफ़ॉल्ट मानों के साथ एक सूची शुरू कर सकते हैं। 'lst = [''] * 10' या' lst = [0] * 10' –

+1

समझ उदाहरण पर एक संस्करण। यदि सरणी में सभी तत्वों को प्रारंभिकरण पर खाली होना आवश्यक है, तो उपयोग करें: 'arr = [श्रेणी में _ के लिए कोई नहीं (10)] '। –

5

(यह सवाल के मूल संस्करण के आधार पर लिखा गया था)

मैं एक खाली सूची बनाना चाहते हैं (या जो भी सबसे अच्छा तरीका है) 10 पकड़ कर सकते हैं। तत्वों।

सभी सूचियों में आप जितनी चाहें उतनी तत्व रख सकते हैं, केवल उपलब्ध स्मृति की सीमा के अधीन। एक सूची का एकमात्र "आकार" महत्वपूर्ण है तत्वों की संख्या वर्तमान में है।

लेकिन जब मैं इसे चलाने, परिणाम []

print display s1 मान्य सिंटैक्स नहीं है, आप जो देख रहे हैं उसके बारे में आपके विवरण के आधार पर, मुझे लगता है कि आपका मतलब display(s1) और फिर print s1 था। इसके लिए, आपको फ़ंक्शन में पास करने के लिए पहले वैश्विक s1 परिभाषित करना होगा।

कॉलिंग display आपके द्वारा लिखी गई सूची को संशोधित नहीं करता है। आपका कोड कहता है "s1 फ़ंक्शन में जो कुछ भी पारित किया गया था उसका नाम है; ठीक है, अब पहली बात यह है कि हम पूरी तरह से उस चीज़ को भूल जाते हैं, और s1 को नव निर्मित list के बजाय संदर्भित करना शुरू करें। अब हम ' list संशोधित करेंगे "। आपके द्वारा पारित मूल्य पर इसका कोई प्रभाव नहीं पड़ता है।

यहां कोई मान देने का कोई कारण नहीं है। (कोई फ़ंक्शन बनाने का कोई वास्तविक कारण नहीं है, लेकिन यह बिंदु के बगल में है।) आप कुछ "बनाना" चाहते हैं, इसलिए यह आपके फ़ंक्शन का आउटपुट है। आपके द्वारा वर्णित चीज़ बनाने के लिए कोई जानकारी आवश्यक नहीं है, इसलिए किसी भी जानकारी को पास न करें। जानकारी प्राप्त करने के लिए, return

है कि आप की तरह कुछ देना होगा:

def display(): 
    s1 = list(); 
    for i in range(0, 9): 
     s1[i] = i 
    return s1 

अगले समस्या आप देखेंगे कि आपकी सूची वास्तव में, केवल 9 तत्वों होगा क्योंकि अंत बिंदु range समारोह द्वारा छोड़ी गई है। (साइड नोट्स के रूप में, [] काम करता है साथ ही साथ list(), अर्धविराम अनावश्यक है, s1 चर के लिए एक खराब नाम है, और range के लिए केवल एक पैरामीटर की आवश्यकता है यदि आप 0 से शुरू कर रहे हैं।) तो फिर आप समाप्त हो जाते हैं

def create_list(): 
    result = list() 
    for i in range(10): 
     result[i] = i 
    return result 

हालांकि, यह अभी भी निशान खो रहा है; range कुछ जादुई कीवर्ड नहीं है जो for और def भाषा का हिस्सा हैं, लेकिन इसके बजाय यह एक कार्य है। और अनुमान लगाओ कि समारोह क्या लौटाता है? यह सही है - उन पूर्णांक की एक सूची। तो पूरा कार्य

def create_list(): 
    return range(10) 

और अब आप देखते हैं कि हमें खुद को एक फ़ंक्शन लिखने की आवश्यकता क्यों नहीं है; range पहले से ही वह फ़ंक्शन है जिसे हम ढूंढ रहे हैं। हालांकि, फिर, सूची में "पूर्व-आकार" की कोई आवश्यकता या कारण नहीं है।

32

varunl के वर्तमान में स्वीकार जवाब नंबर की तरह गैर संदर्भ प्रकार के लिए

>>> l = [None] * 10 
>>> l 
[None, None, None, None, None, None, None, None, None, None] 

वर्क्स में अच्छी तरह से। दुर्भाग्यवश यदि आप सूची-सूची सूचियां बनाना चाहते हैं तो आप त्रुटियों को संदर्भित करने में भाग लेंगे। पायथन 2.7.6:

>>> a = [[]]*10 
>>> a 
[[], [], [], [], [], [], [], [], [], []] 
>>> a[0].append(0) 
>>> a 
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]] 
>>> 

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

def init_list_of_objects(size): 
    list_of_objects = list() 
    for i in range(0,size): 
     list_of_objects.append(list()) #different object reference each time 
    return list_of_objects 


>>> a = init_list_of_objects(10) 
>>> a 
[[], [], [], [], [], [], [], [], [], []] 
>>> a[0].append(0) 
>>> a 
[[0], [], [], [], [], [], [], [], [], []] 
>>> 

वहाँ संभावना एक डिफ़ॉल्ट है, यह कर (बजाय एक समारोह लेखन) की अंतर्निहित अजगर रास्ता है, लेकिन मुझे यकीन है कि यह क्या है नहीं कर रहा हूँ। सही होने के लिए खुश होंगे!

संपादित करें: यह [ [] for _ in range(10)]

उदाहरण:

>>> [ [random.random() for _ in range(2) ] for _ in range(5)] 
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]] 
+10

मैंने सुना है कि 'परिशिष्ट' का उपयोग अक्सर सूची की समझ से कम है। आप '[[] के लिए _ श्रेणी में (10)] के माध्यम से सूचियों की अपनी सूची बना सकते हैं। –

+2

उपरोक्त क्योंकि मैं पागल हो रहा था क्योंकि मेरे पास एक ही डेटा के साथ बहु-आयामी सरणी कई बार दोहराई गई थी और अंत में यह जवाब खोजने से पहले क्या हो रहा था, यह नहीं पता था। ^^ मुझे समझ में नहीं आता कि यह इतना कम क्यों है। – Bregalad

7

वहाँ दो "जल्दी" तरीके हैं:

x = length_of_your_list 
a = [None]*x 
# or 
a = [None for _ in xrange(x)] 

ऐसा लगता है कि [None]*x तेजी से होता है:

>>> from timeit import timeit 
>>> timeit("[None]*100",number=10000) 
0.023542165756225586 
>>> timeit("[None for _ in xrange(100)]",number=10000) 
0.07616496086120605 

लेकिन यदि आप एक सीमा के साथ ठीक हैं (उदा। [0,1,2,3,...,x-1]), तो range(x) सबसे तेजी से हो सकता है:

>>> timeit("range(100)",number=10000) 
0.012513160705566406 
1

मैं हैरान कोई भी खाली सूचियों की सूची तैयार करने के लिए इस सरल दृष्टिकोण का सुझाव कर रहा हूँ। यह एक पुराना धागा है, लेकिन इसे पूर्णता के लिए जोड़ रहा है। यह एक सूची बनाने के लिए 10 खाली सूचियों

x = [[] for i in range(10)] 
-1
s1 = [] 
for i in range(11): 
    s1.append(i) 

print s1 

की एक सूची बना सकते हैं, बस इन कोष्ठक का उपयोग करें: "[]"

एक सूची के लिए कुछ जोड़ने के लिए, उपयोग list.append()

1

यहाँ अजगर में लिखा होगा जो कोई में 2 डी सूची के लिए मेरे कोड है।

empty = [] 
row = int(input()) 

for i in range(row): 
    temp = list(map(int, input().split())) 
    empty.append(temp) 

for i in empty: 
    for j in i: 
     print(j, end=' ') 
    print('') 
0

ऊपर लिखा अद्भुत उत्तर देने के लिए जोड़ा जा रहा है,

बस एक खाली सूची बनाने के लिए, माना जाता है कि "शून्य" उपयोग के साथ,

lst=[0]*size 
0

मैं इस भर में आया था: इनपुट से पंक्तियों की एक ही समस्या की खोज करते समय SO सवाल। मुझे एक 2 डी सरणी बनाना था और फिर एक सूची के तत्वों के साथ प्रत्येक सूची (2 डी सरणी में) के कुछ तत्वों को प्रतिस्थापित करना था। मैं तो तो सवाल जो मुझे मदद मिली है, शायद यह अन्य शुरुआती मदद मिलेगी चारों ओर पाने के लिए this बारे में जाना। कुंजी चाल एक numpy सरणी के रूप में 2 डी सरणी प्रारंभ करने में और उसके बाद array[i][j] की array[i,j] उपयोग करने के बजाय था।

nd_array = [] 
for i in range(30): 
    nd_array.append(np.zeros(shape = (32,1))) 
new_array = [] 
for i in range(len(lines)): 
    new_array.append(nd_array) 
new_array = np.asarray(new_array) 
for i in range(len(lines)): 
    splits = lines[i].split(' ') 
    for j in range(len(splits)): 
     #print(new_array[i][j]) 
     new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1) 

अब मुझे पता है हम सूची समझ का उपयोग कर सकते हैं, लेकिन सादगी खातिर मैं पाश के लिए एक नेस्टेड उपयोग कर रहा हूँ:

संदर्भ के लिए इस जहां मैं इस का इस्तेमाल किया था कोड का टुकड़ा है। उम्मीद है कि यह इस पोस्ट में आने वाले अन्य लोगों की सहायता करेगा।

संबंधित मुद्दे