একটি তালিকার একটি নির্দিষ্ট সূচীতে একটি উপাদান sertোকান এবং আপডেট তালিকাটি ফেরত দিন


102

আমার আছে এটা:

>>> 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)বেশ সংক্ষিপ্ত বলে মনে হচ্ছে, মূল তালিকাটি প্রভাবিত করে না এবং এটি বর্ণনামূলক।
mkoistinen

6
@ mkoistinen এটি আমার পক্ষে কাজ করে না। >>> a = [1, 2, 3, 4] >>> b = a[:].insert(2, 5) >>> print b None
স্পার্কএন্ডশাইন

উত্তর:


91

l.insert(index, obj)আসলে কিছুই ফেরায় না এটি কেবল তালিকা আপডেট করে।

এটিও যেমন বলেছেন, আপনি এটি করতে পারেন b = a[:index] + [obj] + a[index:]। তবে, আরেকটি উপায় হ'ল:

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

56
আপনি যদি পঠনযোগ্য কোডের 3 টি লাইন সহ্য করতে না পারেন তবে এটি কোনও ফাংশনে রেখে কল করুন।
আইসআর্ডার

60

সর্বাধিক কর্মক্ষমতা দক্ষ পদ্ধতির approach

আপনি তালিকায় স্লাইস ইনডেক্সিং ব্যবহার করে উপাদানটি সন্নিবেশ করতে পারেন । উদাহরণ স্বরূপ:

>>> 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খুব। (তবে দয়া করে এটি এভাবে করবেন না It এটি কেবল উদাহরণের জন্য) :

>>> 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পাইথন ৩.৪.৫-এর জন্য 1000 টি উপাদানের তালিকার সাথে সমস্ত উত্তরের তুলনা এখানে :

  • কাটা সন্নিবেশ ব্যবহার করে আমার উত্তর - দ্রুততম (প্রতি লুপে 3.08% সেকেন্ড)

     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 ইউএসসি)

     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 µ সেক সহ খুব ধীর)

     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
    

4
আমি সত্যিই এই ফলাফলটি পছন্দ করি কারণ সমস্যাটি সহজেই সমাধান করার জন্য এটি প্রসারিত হয়, যদি আমি 3, 3.5সেই তালিকায় মানগুলি সন্নিবেশ করতে চাই তবে (ক্রমে) -> a[2:2] = [3,3.5]। খুব ঝরঝরে
মিনিলিণীম

4
কীভাবে একটি [2: 2] = a_list কাজ করে? একটি [২: ২] মূলত ২ য় সূচক থেকে প্রথম তম সূচক (২-১) তে শুরু হচ্ছে তবে এগিয়ে দিক যার অর্থ খালি [] তালিকা। কিভাবে এটি প্রসারিত? আমরা যদি [2: 3: -1] করি তবে এটি কার্যকর হয় না।
স্যামকোডস

দুর্দান্ত উত্তর। আমি ভাবছি সবচেয়ে ভাল পছন্দের জটিলতা যদি ও (1) হয়? যদি তাই হয় তবে কেন?
লারনার ঝাং

এই উত্তরটি আপডেট করা দরকার। একবারের জন্য আমি পাইথন ৩.৪ (এমনকি আমি list.insertঅ্যাসাইনমেন্টের মধ্যে একটি ফ্যাক্টর 2 পাই ) এবং পাইথনের ৩.৮-তে এই পার্থক্যটি সম্পূর্ণভাবে অদৃশ্য হয়ে গেছে the কোনও উপাদান sertোকানোর সুস্পষ্ট উপায়টি হ'ল list.insertস্পষ্টতই ব্যবহার করা ।
a_guest

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

-2

ব্যবহার করুন পাইথন তালিকা সন্নিবেশ () মেথড । ব্যবহার:

#বাক্য গঠন

সন্নিবেশ () পদ্ধতির জন্য সিনট্যাক্স -

list.insert(index, obj)

# প্যারামিটার

  • সূচি - এটি সূচক যেখানে বস্তুর আপত্তিটি সন্নিবেশ করা প্রয়োজন।
  • আপত্তি - এটি প্রদত্ত তালিকায় theোকানো অবজেক্ট।

# রিটার্ন মান এই পদ্ধতিটি কোনও মান দেয় না, তবে এটি প্রদত্ত সূচকে প্রদত্ত উপাদানটি সন্নিবেশ করে।

উদাহরণ:

a = [1,2,4,5]

a.insert(2,3)

print(a)

ফিরে আসে [1, 2, 3, 4, 5]


4
এটি প্রশ্নের উত্তর দেয় না।
গুস্তাভ বার্ট্রাম

5
প্রশ্ন সুনির্দিষ্ট ছিল: Is there anyway I can get the updated list as result, instead of updating the original list in place?আপনার উত্তরটি বিপরীত করে।
লাসল্লোটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.