किसी सूची के अंदर कोई आइटम ले जाना?


जवाबों:


160

insertकिसी सूची की विधि का उपयोग करें :

l = list(...)
l.insert(index, item)

वैकल्पिक रूप से, आप एक स्लाइस अंकन का उपयोग कर सकते हैं:

l[index:index] = [item]

यदि आप उस आइटम को ले जाना चाहते हैं जो सूची में पहले से ही निर्दिष्ट स्थिति में है, तो आपको उसे हटाकर नई स्थिति में सम्मिलित करना होगा:

l.insert(newindex, l.pop(oldindex))

22
बस ध्यान रखें कि सम्मिलित / पॉप विधि के साथ एक सूची में पहले से ही किसी वस्तु को स्थानांतरित करने पर अलग व्यवहार होगा यदि आप सूची के सामने या पीछे की ओर बढ़ रहे हैं। आपके द्वारा चुनी गई वस्तु से पहले बाईं ओर ले जाते हुए। आपके द्वारा चुनी गई वस्तु के बाद आप पीछे की ओर बढ़ते हैं। सूची के अंत में जाने के लिए जाँच करें (सूचकांक त्रुटि)।
एमकेरस

कैसे कई तत्वों को स्थानांतरित करने के लिए? एक सूची = [1,2,3,4,5,6,7,8,9] को देखते हुए, इसे [1,2, [3,4,5], 6,7,8,9 में कैसे बदलना है ]? क्या यह एक चरण में या सूची समझ के साथ किया जा सकता है?
g33kz0r

@Maras I ने इसे पायथन 3.5 के साथ परीक्षण किया और आप last index + 1त्रुटियों के बिना सम्मिलित कर सकते हैं। तत्व को केवल उस स्थिति में सूची में जोड़ा जाता है।
user2061057

@ user2061057 सही है :) यहां तक ​​कि बड़े इंडेक्स के परिणामस्वरूप अंत में डाली गई चीजें होंगी। a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
lee penkman

1
उन लोगों के लिए जो अंत में आइटम सम्मिलित करने के लिए इंडेक्स -1 का उपयोग करने की कोशिश कर रहे हैं, आपको इसके बजाय लेन (एल) का उपयोग करना होगा।
nda

31

एक छोटा सा समाधान, जो केवल आइटम को अंत तक ले जाता है, कहीं भी यह नहीं है:

l += [l.pop(0)]

उदाहरण के लिए:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]

13
आप भी उपयोग कर सकते हैं l.append(l.pop(0))। यह केवल थोड़ा लंबा है, लेकिन यह बहुत अधिक पठनीय है।
coredumperror

मैं इसके बजाय इसे शुरू करने में कैसे सक्षम हो सकता हूं?

19

यदि आप आइटम की स्थिति नहीं जानते हैं, तो आपको पहले सूचकांक खोजने की आवश्यकता हो सकती है:

old_index = list1.index(item)

फिर इसे स्थानांतरित करें:

list1.insert(new_index, list1.pop(old_index))

या IMHO एक क्लीनर तरीका:

try:
  list1.remove(item)
  list1.insert(new_index, item)
except ValueError:
  pass

6
मुझे लगता है कि मैं आपके passबयान पर रोक लगाने के लिए सही हूं ... कभी भी अपवादों को छिपाएं नहीं - इस तरह के उदाहरण में डिफ़ॉल्ट चीज एक क्लीनर त्रुटि बयान या प्रिंट स्टेटमेंट प्रदान करने के लिए होनी चाहिए ... raise ValueError(f'Unable to move item to {new_index}')या print(f'Moving item to {new_index} failed. List remains unchanged.')। हो सकता है passकि किसी फंक्शन में बुलाया जाए try_to_move_itemया कुछ ऐसा किया जाए जिससे यह समझ में आए कि ऑपरेशन चुपचाप विफल हो सकता है।
flutefreak7

3

एक समाधान बहुत सरल है, लेकिन आपको मूल स्थिति के सूचकांक और नई स्थिति के सूचकांक को जानना होगा:

list1[index1],list1[index2]=list1[index2],list1[index1]

6
यह एक अदला-बदली है, एक चाल नहीं।
१२:१

0

मैंने समय-सीमा के साथ एक ही सूची में एक आइटम को स्थानांतरित करने के लिए कुछ तरीकों को प्रोफाइल किया। अगर j> i का उपयोग करने वाले ये हैं:

┌──────────┬──────────────────────┐
│ 14.4usec [x [i: i] = x.pop (j), ec
Ec 14.5usec [x [i: i] = [x.pop (j)] ec
│ 15.2usec .in x.insert (i, x.pop (j)) ec
└──────────┴──────────────────────┘

और यहाँ का उपयोग करने के लिए अगर j <= i:

┌──────────┬───────────────────────────┐
│ 14.4usec [x [i: i] = x [j], डेल x [j] ec;
│ 14.4usec [x [i: i] = [x [j]]; del x [j] ec
│ 15.4usec .in x.insert (i, x [j]); del x [j] ec
└──────────┴───────────────────────────┘

बहुत बड़ा अंतर नहीं है यदि आप इसे केवल कुछ ही बार उपयोग करते हैं, लेकिन यदि आप मैनुअल छंटाई जैसे भारी सामान करते हैं, तो सबसे तेज़ लेना महत्वपूर्ण है। अन्यथा, मैं आपको केवल वही पढ़ने की सलाह दूंगा जो आपको लगता है कि सबसे अधिक पठनीय है।

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