2012-04-24 19 views
27

मैं एक सूची समझ में असाइनमेंट ऑपरेटर का उपयोग करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?मैं सूची समझ में असाइनमेंट कैसे कर सकता हूं?

निम्नलिखित कोड अमान्य वाक्यविन्यास है। मैं अगर यह pattern से मेल खाता है एक खाली स्ट्रिंग '' को lst[0] स्थापित करने के लिए मतलब है:

[ lst[0] = '' for pattern in start_pattern if lst[0] == pattern ] 

धन्यवाद!

+3

मुझे लगता है कि आपके पास यह अंदर है ... – dawg

+4

यह बहुत स्पष्ट नहीं है। यह एक तत्काल चेतावनी संकेत है। –

उत्तर

20

ऐसा लगता है कि आप पाइथन में looping constructs के साथ list comprehension भ्रमित कर रहे हैं।

एक सूची समझ उत्पन्न करता है - एक सूची! यह मौजूदा सूची में खुद को एक ही असाइनमेंट में उधार नहीं देता है। (हालांकि आप इसे करने के लिए वाक्यविन्यास को यातना दे सकते हैं ...)

हालांकि यह बिल्कुल स्पष्ट नहीं है कि आप अपने कोड से क्या करने का प्रयास कर रहे हैं, मुझे लगता है कि यह सूची (प्रवाह नियंत्रण) पर लूपिंग के समान है

for pattern in patterns: 
    if lst[0] == pattern: lst[0]='' 

यह करने के लिए एक उचित तरीका है, और आप सी, पास्कल, आदि लेकिन आप में क्या करेंगे है: एक सूची (सूची समझ)

लूप इस तरह सूची से अधिक उत्पादन बनाम एक मूल्य के लिए सूची का परीक्षण भी कर सकते हैं और इसे बदल सकते हैं:

if lst[0] in patterns: lst[0] = '' 

या, यदि आप सूचकांक पता नहीं है:

i=lst.index[pattern] 
lst[i]='' 

या तो आप सूचियां की एक सूची है और प्रत्येक sublist में से प्रत्येक के पहले तत्व को बदलना चाहते हैं:

for i, sublst in enumerate(lst): 
    if sublst[i][0] in patterns: sublist[i][0]='' 

आदि, आदि, आदि

यदि आप किसी सूची के प्रत्येक तत्व को कुछ लागू करना चाहते हैं, तो आप पाइथन किट में एक सूची समझ, या मानचित्र या कई अन्य उपकरणों का उपयोग करके देख सकते हैं।

व्यक्तिगत रूप से, मैं आमतौर पर सूची निर्माण के लिए और अधिक सूची comprehensions का उपयोग करते हैं:

l=[[ x for x in range(5) ] for y in range(4)] #init a list of lists... 

कौन सा की तुलना में अधिक स्वाभाविक है:

l=[] 
for i in range(4): 
    l.append([]) 
    for j in range(5): 
     l[i].append(j)  

लेकिन सूची के उसी सूची है, जो अधिक है संशोधित करने के लिए समझा जा सकता?

यह:

l=[['new value' if j==0 else l[i][j] for j in range(len(l[i]))] for i in range(len(l))] 

या इस:

for i,outter in enumerate(l): 
    l[i][0]='new value'    

YMMV

Here इस पर एक बड़ा ट्यूटोरियल है।

+3

और इसे पैटर्न में 'if lst [0] के रूप में लिखा जाना चाहिए: lst [0] =' ''। –

+1

@Tim: इसे एक उत्तर के रूप में सबमिट करें! मुझे विश्वास नहीं है कि मैं इसे स्पष्ट करने के तीन अन्य तरीकों से आया हूं ... ;-) – Cameron

+0

@ टिम पिट्ज़कर: जिस तरह से मैं इसे लिखूंगा, लेकिन मैं दिखाना चाहता था (मेरी व्याख्या) कि वह यह अंदर था ... – dawg

4

संक्षेप में: आप नहीं करते हैं। सूचियों को उत्पन्न करने के लिए सूची की सूची मौजूदा सूचियों को संशोधित नहीं कर रही है। यदि आप किसी सूची को संशोधित करना चाहते हैं, तो लूप के लिए उपयोग करें, जैसा कि वे हैं।

कि कोड लिखना होगा pythonic तरीका कुछ की तरह:

for pattern in start_pattern: 
    if lst[0] == pattern: 
     lst[0] = '' 
     #the following assumes that pattern will never be '' 
     #if that's possible, you can ignore this bit 
     break 

हालांकि, अगर आप सच में, सच एक के अंदर काम करना चाहते हैं, और हर अजगर प्रोग्रामर जो कभी साथ संबंधित कोई आपत्ति नहीं है अगर आपके कोड सभी अनंत काल के लिए यह नफरत, कुछ कार्यों का उपयोग कर सकते हैं:

  • चर आप निर्दिष्ट कर सकते हैं एक वैश्विक है, तो आप कर सकते हैं

    globals().update(var=value) 
    
  • चर आप को सौंपना चाहते हैं परिवर्तनशील अनुक्रम या (जैसे एक सूची या एक dict के रूप में) एक नक्शे है

    list.__setitem__(index, value) 
    
+0

ब्रेक हमेशा मान्य है। यहां तक ​​कि यदि डेटा में '' '' है, तो यह केवल 'lst [0] 'को उसी मान को पुन: असाइन करने का कारण बन जाएगा ... – Cameron

+0

जब तक कि lst एक उत्परिवर्तनीय अनुक्रम प्रकार न हो, जहां तत्व असाइनमेंट को ट्रैक रखने के लिए ओवरलोड किया गया हो किसी दिए गए मान को कितनी बार असाइन किया गया था, या किसी अन्य प्रकार के गैर मानक व्यवहार। –

+0

हम्म, अच्छा बिंदु। मुझे उम्मीद है कि यह एक बहुत दुर्लभ घटना है, हालांकि :-) – Cameron

7

अजगर भाषा अभिव्यक्ति और बयानों के लिए अलग अवधारणाओं है।

असाइनमेंट एक बयान है, भले ही वाक्य रचना कभी कभी यह सोच कर यह एक अभिव्यक्ति है (उदाहरण के लिए a=b=99 काम करता है लेकिन एक विशेष वाक्य रचना मामला है और इसका मतलब यह नहीं है कि b=99 एक अभिव्यक्ति है जैसे कि यह सी में उदाहरण के लिए) में चालें आप।

सूची समझें बदले में अभिव्यक्तियां हैं क्योंकि वे एक मूल्य लौटते हैं, एक अर्थ में वे जो लूप करते हैं वह एक घटना है और मुख्य बिंदु लौटाई गई सूची है।

एक कथन में अभिव्यक्ति हो सकती है लेकिन एक अभिव्यक्ति में बयान शामिल नहीं हो सकते हैं।

हालांकि कहा गया है कि सूची वस्तु का आकलन आंतरिक रूप से एक विधि कॉल में परिवर्तित किया गया है (सूची जैसी वस्तुओं के निर्माण की अनुमति देने के लिए) और विधि कॉल अभिव्यक्तियां हैं। इसलिए आप कर सकते हैं तकनीकी रूप से उपयोग एक अभिव्यक्ति में सूची आइटम असाइनमेंट:

[ lst.__setitem__(0, '') for pattern in start_pattern if lst[0] == pattern ] 

हालांकि यह बुरा माना जाता है, क्योंकि यह पठनीयता हानि पहुँचाता है और कितना आसान स्रोत कोड पायथन भाषा में मुख्य ध्यान है पढ़ने के लिए है। आप के बजाय उदाहरण के लिए लिखना चाहिए ...

for pattern in start_pattern: 
    if lst[0] == pattern: 
     lst[0] = '' 

कि in ऑपरेटर के लिए जिस तरह से धन्यवाद करके और भी अधिक पठनीय

if lst[0] in start_pattern: 
    lst[0] = '' 

सूची comprehensions के बराबर है उनकी वापसी मूल्य के लिए उपयोग किया जाता है और वे बनाने के एक लूप आंतरिक रूप से ... यदि आप चाहते हैं कि लूप है तो बस एक लूप लिखें ... जो भी यह समझने की कोशिश कर रहे कोड को पढ़ेगा कि यह क्या करता है (और जो भी कुछ हफ्तों में स्वयं को शामिल करता है) की सराहना करता है।

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