2013-09-03 5 views
7

मैं अजगर में एक सूची प्रारंभ करना चाहता हूं। मुझे समझ नहीं आता क्यों नीचे कोड काम नहीं करता:किसी सूची के सदस्यों को प्रारंभ करने

u = [len(item) for item in u] 

लेकिन, मेरे सवाल क्यों पहले कोड काम नहीं करता है:

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 
for item in u: 
item = len(item) 

वहाँ, सूची प्रारंभ करने जैसे अन्य तरीके हैं।

संपादित करें: मैं पाइथन और प्रोग्रामिंग के लिए नौसिखिया हूं। दुर्भाग्य से मैं आपके उत्तरों के कुछ हिस्सों को समझ नहीं पा रहा हूं। rebinding में "rebinding नाम item नाम की लंबाई item करने के लिए"
- - "आइटम" में इटरेटर एक अस्थायी चर है कि एक u का एक तत्व की ओर इशारा करता है
: उदाहरण के लिए जहां (छुपा हुआ) इटरेटर

इशारा कर रही है जहां तक ​​मैं समझता हूँ पर आधारित है, मेरी दूसरी उदाहरण, स्मृति में एक new_list बनाता है, औरकरने के लिए new_list के मूल्यों प्रदान करती है। कोई फर्क नहीं पड़ता कि पिछले मूल्य क्या थे। लेकिन मैं जानना चाहता हूं कि मैं पहली सूची में मूल्यों को कैसे बदल सकता हूं। धन्यवाद

उत्तर

4

पहले मामले में, आप कुछ भी शुरू नहीं कर रहे हैं। "आइटम" एक अस्थायी चर है जो आपके आधार पर इंगित करता है कि (अंतर्निहित) इटेटरेटर कहां इंगित कर रहा है। आप पहली बार शैली में एक सूची को प्रारंभ करना चाहते हैं, तो आप इतनी के रूप में कर सकते हैं:

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 
v = [] 
for item in u: 
    v.append(len(item)) 
print v 
3

आप item नाम item नाम की लंबाई पर पुनर्निर्मित कर रहे हैं जो लूप द्वारा बस बाध्य था। आप इस तरह से list प्रारंभ नहीं कर सकते हैं। आप जो भी कर रहे हैं वह प्रत्येक पुनरावृत्ति में एक चर को पुन: संयोजित कर रहा है। list आरंभ करने के लिए आपकी सूची समझ पूरी तरह से स्वीकार्य विधि है।

+0

आइटम पहले मामले में एक स्ट्रिंग है, क्योंकि सूची के तत्व आप तार हैं। कोई तारों पर लेन() को कॉल कर सकता है। –

+1

हाँ, मैंने अपना जवाब सही किया। –

0

पहले कोड काम करता है। सूची u पहली पंक्ति में शुरू की गई है और अगली दो पंक्तियां शेष कोड पर कोई प्रभाव नहीं डालती हैं - उनके लिए कोई बात नहीं है।

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 

सामग्री ['abc', 'de', 'fghi', 'jklm', 'n', ''] साथ सूची u आरंभ कर रहा है - कि तुम सब एक सूची प्रारंभ करने में क्या करने की जरूरत है।

लाइनों

for item in u: 
    item = len(item) 

बस u में सभी मूल्यों को नाम item बाँध के तुरंत बाद मूल्य एक-एक करके की लंबाई संपत्ति को item rebind तक दुभाषिया पूरी सूची के माध्यम से काम किया है।

+1

यह उत्तर ओपी को बताकर सुधार किया जा सकता है कि वास्तव में सूची को कैसे प्रारंभ किया जाए। – kojiro

1

आप उस सूची में किसी प्रविष्टि का प्रतिनिधित्व करने वाले नाम पर एक नया मान निर्दिष्ट करके किसी सूची की सामग्री को नहीं बदल सकते हैं। आपको इंडेक्स असाइनमेंट का उपयोग करने की आवश्यकता है, उदाहरण के लिए सूची में पहली प्रविष्टि को 'foo' में बदलने के लिए आप u[0] = 'foo' कर सकते हैं।

इस मामले में आप (क्लीनर यद्यपि आप सवाल से सूची समझ है) निम्नलिखित की तरह कुछ कर सकता है:

for i, item in enumerate(u): 
    u[i] = len(item) 

ध्यान दें कि यदि आपकी सूची में आइटम परिवर्तनशील हैं आप तत्व सीधे संशोधित कर सकते हैं, आप बस उन्हें फिर से सौंप नहीं सकते हैं। सूचियों की सूची के साथ उदाहरण के लिए:

u = [['a'], ['b', 'c']] 
for item in u: 
    item.append(len(item)) 
# u is now [['a', 1], ['b', 'c', 2]] 
1

कारण पहले कोड काम नहीं करता क्योंकि item अनुक्रम u में प्रत्येक iterable वस्तु के लिए सिर्फ एक संदर्भ है। जब आप item = len(item) कहते हैं तो आप वास्तव में len(item)item पर असाइन करते हैं, लेकिन item केवल आपके लूप में i * th * चरण के लिए u[i] पर इंगित संदर्भ सूचक के रूप में कार्य कर रहा था, यह वास्तव में u[i] को नहीं बदलेगा।

जैसे आप अपने सवाल में दिखाया बदल u[i] आप सूची समझ कर सकते हैं, या की तरह कुछ करने के लिए: एक तीसरा रास्ता बहुत उपयोगी enumerate विधि अजगर 2.3 में शुरू की गई है

for i in range(len(u)): 
    u[i] = len(u[i]) 

for i, item in enumerate(u): 
    u[i] = len(item) 

Enumerate अपने तर्क से बनाए गए tuples की सूची लौटाता है (इस पर मुझे बोली नहीं है ... लेकिन यह मूल रूप से कृत्यों tuples की एक सूची के रूप में) जहां प्रत्येक टपल के अंदर प्रपत्र (सूचकांक की है , तर्क [सूचकांक])।

+0

आपके पास 'u [i] = len (item)' 'enumerate' उदाहरण में होना चाहिए। –

+0

इसे बदल दिया। धन्यवाद। – Shashank

0

item सिर्फ नाम है। for पाश में:

for item in u: 

item एक संदर्भ वस्तु जो करने के लिए यू [i] संदर्भित करता है है। दूसरे शब्दों में, item और u[i] एक ही ऑब्जेक्ट का संदर्भ लें।

लेकिन इस बयान:

item = len(item) 

परिवर्तन itemके नाम एक पूर्णांक, जिसका मूल्य लेन है (मद) को देखें।

तो सूची में कुछ भी नहीं बदला।

सूची समझ:

u = [len(item) for item in u] 

सिर्फ एक नई सूची बनाने की है, और नाम यू अब नई सूची के लिए एक संदर्भ है।

for i, item in enumerate(u): 
    u[i] = len(item) 

एक द्वारा यू एक की वस्तुओं के referrings परिवर्तन है कि:

आप पाश के लिए उपयोग करना चाहते हैं, तो आप enumerate कथन का उपयोग कर सकते हैं।

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

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