2010-04-06 10 views
140

मुझे एक सूची के माध्यम से खोजना है और एक तत्व के सभी घटनाओं को दूसरे के साथ बदलना है। अब तक कोड में मेरे प्रयास मुझे कहीं नहीं मिल रहे हैं, ऐसा करने का सबसे अच्छा तरीका क्या है?किसी सूची (पायथन) में तत्वों को ढूंढना और बदलना

उदाहरण के लिए, मेरी सूची निम्नलिखित पूर्णांकों

>>> a = [1,2,3,4,5,1,2,3,4,5,1] 

है और मैं मान के साथ नंबर 1 की सभी घटनाओं को बदलने के लिए की जरूरत है 10 इसलिए उत्पादन की आवश्यकता

>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10] 

इस प्रकार है मेरा लक्ष्य नंबर 1 के साथ नंबर 1 के सभी उदाहरणों को प्रतिस्थापित करना है।

+6

इसके लिए क्या है? – outis

उत्तर

144
>>> a= [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1] 
>>> for n, i in enumerate(a): 
... if i == 1: 
...  a[n] = 10 
... 
>>> a 
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10] 
+2

से एक अलग 'आईडी() '(पहचान) के साथ एक नई सूची' ए 'बनाई जाएगी यह एक बुरा और बहुत ही अनियंत्रित समाधान है। सूची समझ का उपयोग करने पर विचार करें। – AdHominem

+49

यह बहुत अच्छा है अगर बहुत अन-पायथनिक समाधान। सूची समझ का उपयोग करने पर विचार करें। –

314

list comprehension और ternary operator का उपयोग करने का प्रयास करें।

>>> a=[1,2,3,1,3,2,1,1] 
>>> [4 if x==1 else x for x in a] 
[4, 2, 3, 4, 3, 2, 4, 4] 
+4

लेकिन यह सही नहीं है हालांकि 'a' बदलता है? मुझे लगता है कि ओपी – Dula

+4

@Dula को बदलना चाहता था @ डूला आप एक = [4 अगर x == 1 x x में x के लिए x] कर सकते हैं, तो यह –

+0

@Dula को प्रभावित करेगा: सवाल यह है कि 'ए' उत्परिवर्तित होना चाहिए, लेकिन (जैसा कि अलेखाया दिखाता है) सूची समझ का उपयोग करते समय किसी भी मामले को संभालना मुश्किल है। – outis

7
>>> a=[1,2,3,4,5,1,2,3,4,5,1] 
>>> item_to_replace = 1 
>>> replacement_value = 6 
>>> indices_to_replace = [i for i,x in enumerate(a) if x==item_to_replace] 
>>> indices_to_replace 
[0, 5, 10] 
>>> for i in indices_to_replace: 
...  a[i] = replacement_value 
... 
>>> a 
[6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6] 
>>> 
17

सूची समझ में अच्छी तरह से काम करता है - और गणना के साथ के माध्यम से पाशन आप कुछ स्मृति बचा सकता है (ख/आपरेशन के अनिवार्य रूप से जगह में कर ग)।

वहाँ भी कार्यात्मक प्रोग्रामिंग है ... map के उपयोग देखें:

 
    >>> a = [1,2,3,2,3,4,3,5,6,6,5,4,5,4,3,4,3,2,1] 
    >>> map(lambda x:x if x!= 4 else 'sss',a) 
    [1, 2, 3, 2, 3, 'sss', 3, 5, 6, 6, 5, 'sss', 5, 'sss', 3, 'sss', 3, 2, 1] 
+10

+1। यह बहुत खराब है 'लैम्ब्डा' और 'मानचित्र' को अवांछित माना जाता है। – outis

+3

मुझे यकीन नहीं है कि लैम्ब्डा या नक्शा स्वाभाविक रूप से अवांछित है, लेकिन मैं इस बात से सहमत हूं कि एक सूची समझ क्लीनर है और उनमें से दो का उपयोग करने के बजाय अधिक पठनीय है। – damzam

+4

मैं उन्हें खुद को अस्पष्ट नहीं मानता, लेकिन कई लोग करते हैं, जिनमें गिडो वैन रॉसम (http://www.artima.com/weblogs/viewpost.jsp?thread=98196) शामिल हैं।यह उन सांप्रदायिक चीजों में से एक है। – outis

6

आप को बदलने के लिए कई मान है, तो आप भी एक शब्दकोश का उपयोग कर सकते हैं:

a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1] 
dic = {1:10, 2:20, 3:'foo'} 

print([dic.get(n, n) for n in a]) 

> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10] 
+1

यदि यह 'dic' में नहीं मिलता है तो क्या यह कोई त्रुटि नहीं फेंकता है? –

+0

धन्यवाद, आप सही हैं, मैंने एक कोशिश-पकड़ ब्लॉक जोड़ा। – roipoussiere

+2

@ user2914540 मैंने आपके उत्तर को थोड़ा सुधार दिया है, इसलिए यह काम करता है अगर 'n' नहीं मिला है। मुझे आशा है कि आपको बुरा लगेगा। आपका 'प्रयास/छोड़कर' समाधान अच्छा नहीं था। – jrjc

1

निम्नलिखित एक बहुत है पायथन 2.x

a = [1,2,3,4,5,1,2,3,4,5,1]  #Replacing every 1 with 10 
for i in xrange(len(a)): 
    if a[i] == 1: 
    a[i] = 10 
print a 

यह विधि काम करता है। टिप्पणियाँ स्वागत है। उम्मीद है कि यह मदद करता है :)

यह भी समझने की कोशिश करें कि कैसे outis's और damzam's समाधान कार्य करते हैं। सूची संपीड़न और लैम्ब्डा फ़ंक्शन उपयोगी टूल हैं।

1
a = [1,2,3,4,5,1,2,3,4,5,1,12] 
for i in range (len(a)): 
    if a[i]==2: 
     a[i]=123 

आप लूप के लिए और या तो उपयोग कर सकते हैं; हालांकि यदि आप बिल्टिन एन्युमरेट फ़ंक्शन को जानते हैं, तो गणना करने के लिए अनुशंसा की जाती है। 1

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