पायथन सूची में दो वस्तुओं की स्थिति कैसे स्विच करें?


208

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

यह सरल है - मेरे पास यह सूची है:

['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']

मैं की स्थिति स्विच करना चाहते हैं 'password2'और 'password1'- उनकी सही स्थिति जानने के नहीं, केवल कि वे सही एक दूसरे के और करने के लिए अगले हो password2पहला है।

मैंने इसे कुछ लंबी-लंबी सूची वाली सूची के साथ पूरा किया है, लेकिन मैंने इसके बारे में सोचा है कि यह कुछ अधिक सुरुचिपूर्ण है?


क्या आपकी समस्या सूची में 'पासवर्ड 2' खोजने की कोशिश करने की दक्षता है? क्या 'पासवर्ड 2' से पहले 'पासवर्ड 1' आ सकता है? क्या यहाँ कुछ जटिलता है जो आपके मूल प्रश्न में नहीं आती है? नहीं तो मैं @unwind से सहमत हूँ।
ब्रेंट राइट्स कोड

3
आपको वह पोस्ट करना चाहिए जो आपके पास है - मैं आपके बारे में उत्सुक हूं कि आप "बल्कि लंबी-सूची वाली सूची-सदस्यता" से क्या मतलब है।
samtregar

Index1 = index ('पासवर्ड 1') की तर्ज पर कुछ; index2 = index ('पासवर्ड 2'); order = order [: index2] .append (क्रम [index1])। परिशिष्ट (क्रम [index2])। परिशिष्ट (क्रम [index1 + 1:]); कुछ और लाइनों पर फैल गया। सुंदर, नहीं।
मिकाल

जवाबों:


392
    i = ['title', 'email', 'password2', 'password1', 'first_name', 
         'last_name', 'next', 'newsletter']
    a, b = i.index('password2'), i.index('password1')
    i[b], i[a] = i[a], i[b]

165

सरल अजगर स्वैप इस तरह दिखता है:

foo[i], foo[j] = foo[j], foo[i]

अब आपको बस इतना करना है कि यह क्या iहै, और यह आसानी से किया जा सकता है index:

i = foo.index("password2")

15

आपके चश्मे को देखते हुए, मैं स्लाइस-असाइनमेंट का उपयोग करूंगा:

>>> L = ['title', 'email', 'password2', 'password1', 'first_name', 'last_name', 'next', 'newsletter']
>>> i = L.index('password2')
>>> L[i:i+2] = L[i+1:i-1:-1]
>>> L
['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']

स्लाइस असाइनमेंट का दाहिना हाथ एक "उलटा टुकड़ा" है और इसे वर्तनी भी किया जा सकता है:

L[i:i+2] = reversed(L[i:i+2])

यदि आपको लगता है कि अधिक पठनीय, के रूप में कई होगा।


यदि आप शीर्षक और मेल स्विच करना चाहते हैं तो यह काम क्यों नहीं कर रहा है, पहला तत्व दूसरा?
लुइगी टिबुरज़ी

क्षमा करें, अब मुझे समझ में आया, i-1 में कोई तत्व नहीं हैं इसलिए एक खाली सूची वापस आ गई है
लुइगी टिबुरज़ी

7

इससे ज्यादा लंबा कैसे हो सकता है

tmp = my_list[indexOfPwd2]
my_list[indexOfPwd2] = my_list[indexOfPwd2 + 1]
my_list[indexOfPwd2 + 1] = tmp

यह अस्थायी भंडारण का उपयोग करके केवल एक सादे स्वैप है।


13
यदि आप इसके बारे में वास्तव में "पायथन" बनना चाहते हैं, तो आप हमेशा ऐसा कर सकते हैं:my_list[indexOfPwd2],my_list[indexOfPwd2+1] = my_list[indexOfPwd2+1],my_list[indexOfPwd2]
ब्रेंट राइट्स कोड

0
for i in range(len(arr)):
    if l[-1] > l[i]:
        l[-1], l[i] = l[i], l[-1]
        break

इसके परिणामस्वरूप यदि अंतिम तत्व स्थिति में तत्व से अधिक है iतो वे दोनों स्वैप हो जाते हैं।


-1

आप उदाहरण के लिए उपयोग कर सकते हैं:

>>> test_list = ['title', 'email', 'password2', 'password1', 'first_name',
                 'last_name', 'next', 'newsletter']
>>> reorder_func = lambda x: x.insert(x.index('password2'),  x.pop(x.index('password2')+1))
>>> reorder_func(test_list)
>>> test_list
... ['title', 'email', 'password1', 'password2', 'first_name', 'last_name', 'next', 'newsletter']

-1

मैं अजगर में विशेषज्ञ नहीं हूं, लेकिन आप कोशिश कर सकते हैं: कहते हैं

i = (1,2)

res = lambda i: (i[1],i[0])
print 'res(1, 2) = {0}'.format(res(1, 2)) 

ऊपर के रूप में ओ / पी देंगे:

res(1, 2) = (2,1)

1
यह स्वैप करने के लिए कुंजियों की स्थिति को जाने बिना काम नहीं करता है।
13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.