किसी सूची में एक विशिष्ट सूचकांक में एक तत्व डालें और अद्यतन सूची वापस करें


99

मेरे पास यह है:

>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]

>>> print a.insert(2, 3)
None

>>> print a
[1, 2, 3, 4]

>>> b = a.insert(3, 6)
>>> print b
None

>>> print a
[1, 2, 3, 6, 4]

क्या कोई तरीका है जिसके परिणामस्वरूप मैं अद्यतन सूची प्राप्त कर सकता हूं, बजाय मूल सूची को अद्यतन करने के?


11
b = a[:].insert(2,3)बहुत कम लगता है, मूल सूची को प्रभावित नहीं करता है और बहुत वर्णनात्मक है।
मोकिस्टीन

6
@mkoistinen यह मेरे लिए काम नहीं करता है। >>> a = [1, 2, 3, 4] >>> b = a[:].insert(2, 5) >>> print b None
स्पार्कएंडशाइन

जवाबों:


89

l.insert(index, obj)वास्तव में कुछ भी वापस नहीं करता है। यह सिर्फ सूची को अद्यतन करता है।

जैसा कि एटीओ ने कहा, आप कर सकते हैं b = a[:index] + [obj] + a[index:]। हालांकि, एक और तरीका है:

a = [1, 2, 4]
b = a[:]
b.insert(2, 3)

56
यदि आप पठनीय कोड की 3 पंक्तियों को बर्दाश्त नहीं कर सकते हैं, तो इसे एक फ़ंक्शन में रखें और इसे कॉल करें।
आइसडॉर

54

अधिकांश प्रदर्शन कुशल दृष्टिकोण

आप सूची में स्लाइस इंडेक्सिंग का उपयोग करके तत्व भी डाल सकते हैं । उदाहरण के लिए:

>>> a = [1, 2, 4]
>>> insert_at = 2  # Index at which you want to insert item

>>> b = a[:]   # Created copy of list "a" as "b".
               # Skip this step if you are ok with modifying the original list

>>> b[insert_at:insert_at] = [3]  # Insert "3" within "b"
>>> b
[1, 2, 3, 4]

दिए गए इंडेक्स में कई तत्वों को एक साथ सम्मिलित करने के लिए , आपको केवल उन listकई तत्वों का उपयोग करना है, जिन्हें आप सम्मिलित करना चाहते हैं। उदाहरण के लिए:

>>> a = [1, 2, 4]
>>> insert_at = 2   # Index starting from which multiple elements will be inserted

# List of elements that you want to insert together at "index_at" (above) position
>>> insert_elements = [3, 5, 6]

>>> a[insert_at:insert_at] = insert_elements
>>> a   # [3, 5, 6] are inserted together in `a` starting at index "2"
[1, 2, 3, 5, 6, 4]

सूची समझ का उपयोग करके वैकल्पिक (लेकिन प्रदर्शन के मामले में बहुत धीमी गति से) :

एक विकल्प के रूप में, यह भी के साथ सूची समझ का उपयोग कर प्राप्त किया जा सकता enumerateहै। (लेकिन कृपया इसे इस तरह न करें। यह सिर्फ दृष्टांत के लिए है) :

>>> a = [1, 2, 4]
>>> insert_at = 2

>>> b = [y for i, x in enumerate(a) for y in ((3, x) if i == insert_at else (x, ))]
>>> b
[1, 2, 3, 4]

सभी समाधानों की प्रदर्शन तुलना

यहाँ timeitपायथन 3.4.5 के लिए 1000 तत्वों की सूची के साथ सभी उत्तरों की तुलना की गई है:

  • कटा हुआ सम्मिलन का उपयोग करके मेरा जवाब - सबसे तेज़ (3.08 loopsec प्रति लूप)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b[500:500] = [3]"
     100000 loops, best of 3: 3.08 µsec per loop
  • कटा हुआ सूची के विलय के आधार पर ATOzTOA का स्वीकृत उत्तर - दूसरा (6.71 प्रति लूप)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "b = a[:500] + [3] + a[500:]"
     100000 loops, best of 3: 6.71 µsec per loop
  • सर्वाधिक मतों के साथ रूशी पांचाल का जवाबlist.insert(...) - तीसरा (26.5 usec प्रति लूप)

     python3 -m timeit -s "a = list(range(1000))" "b = a[:]; b.insert(500, 3)"
     10000 loops, best of 3: 26.5 µsec per loop
  • सूची सम्मिश्रण के साथ मेरा उत्तर औरenumerate- चौथा (168 loopsec प्रति लूप के साथ बहुत धीमा)

     mquadri$ python3 -m timeit -s "a = list(range(1000))" "[y for i, x in enumerate(a) for y in ((3, x) if i == 500 else (x, )) ]"
     10000 loops, best of 3: 168 µsec per loop

2
मुझे वास्तव में यह परिणाम पसंद है क्योंकि यह आसानी से समस्या को हल करने के लिए विस्तारित होता है, क्या होगा यदि मैं 3, 3.5उस सूची में मूल्यों को सम्मिलित करना चाहता हूं (क्रम में) -> a[2:2] = [3,3.5]। बहुत साफ
मिनट पर मिनिलिनम

1
एक [२: २] = a_list कैसे काम करती है? एक [२: २] मूल रूप से २ सूचकांक से १ सूचकांक (२-१) तक शुरू होता है, लेकिन आगे की दिशा में जिसका अर्थ है एक खाली [] सूची। इसका विस्तार कैसे होता है? अगर हम [2: 3: -1] करते हैं तो यह काम नहीं करता है।
सैमकोड्स

बहुत बढ़िया जवाब। मुझे आश्चर्य है कि क्या सबसे अच्छा विकल्प की जटिलता हे (1) है? यदि हां, तो क्यों?
लर्नर जांग

इस उत्तर को अद्यतन करने की आवश्यकता है। एक बार जब मैं पायथन 3.4 के साथ भी रिपोर्ट किए गए समय को पुन: उत्पन्न नहीं कर सकता (मुझे एक कारक 2 के बीच list.insertऔर स्लाइस असाइनमेंट मिलता है), और पायथन 3.8 पर यह अंतर पूरी तरह से गायब हो गया है। एक तत्व सम्मिलित करने का सबसे स्पष्ट तरीका स्पष्ट list.insertरूप से उपयोग करना है ।
agguest

39

सबसे छोटा मुझे मिला: b = a[:2] + [3] + a[2:]

>>>
>>> a = [1, 2, 4]
>>> print a
[1, 2, 4]
>>> b = a[:2] + [3] + a[2:]
>>> print a
[1, 2, 4]
>>> print b
[1, 2, 3, 4]

कोड की लाइनों की संख्या कोड गुणवत्ता का एक अच्छा उपाय नहीं है। यह दृष्टिकोण प्रदर्शन और पठनीयता दोनों कारणों से त्रुटिपूर्ण है।
a_guest

0

सबसे साफ तरीका यह है कि सूची को कॉपी करें और फिर ऑब्जेक्ट को कॉपी में डालें। पायथन 3 पर इसके माध्यम से किया जा सकता है list.copy:

new = old.copy()
new.insert(index, value)

अजगर 2 पर सूची की नकल के माध्यम से प्राप्त किया जा सकता है new = old[:](यह पायथन 3 पर भी काम करता है)।

प्रदर्शन के संदर्भ में अन्य प्रस्तावित विधियों में कोई अंतर नहीं है:

$ python --version
Python 3.8.1
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b.insert(500, 3)"
100000 loops, best of 5: 2.84 µsec per loop
$ python -m timeit -s "a = list(range(1000))" "b = a.copy(); b[500:500] = (3,)"
100000 loops, best of 5: 2.76 µsec per loop

-1

का प्रयोग करें अजगर सूची डालने () विधि । उपयोग:

#वाक्य - विन्यास

सम्मिलित करने के लिए सिंटैक्स () विधि -

list.insert(index, obj)

#parameters

  • इंडेक्स - यह वह इंडेक्स है जहां ऑब्जेक्ट ऑब्जेक्ट को डालने की जरूरत होती है।
  • obj - यह दी गई सूची में डाली जाने वाली वस्तु है।

# रीटर्न वैल्यू यह विधि किसी भी मूल्य को वापस नहीं करती है, लेकिन यह दिए गए इंडेक्स में दिए गए तत्व को सम्मिलित करती है।

उदाहरण:

a = [1,2,4,5]

a.insert(2,3)

print(a)

रिटर्न [1, 2, 3, 4, 5]


2
इस सवाल का जवाब नहीं है।
गुस्ताव बर्तराम

5
प्रश्न विशिष्ट था: Is there anyway I can get the updated list as result, instead of updating the original list in place?आपका उत्तर इसके विपरीत है।
लासज्लोती
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.