Listedeki belirli bir dizine bir öğe ekleyin ve güncellenmiş listeyi geri getirin


102

Bu bende var:

>>> 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]

Orijinal listeyi yerinde güncellemek yerine, sonuç olarak güncellenmiş listeyi almanın bir yolu var mı?


11
b = a[:].insert(2,3)oldukça kısa görünüyor, orijinal listeyi etkilemiyor ve oldukça açıklayıcı.
mkoistinen

6
@mkoistinen Benim için çalışmıyor. >>> a = [1, 2, 3, 4] >>> b = a[:].insert(2, 5) >>> print b None
SparkAndShine

Yanıtlar:


91

l.insert(index, obj)aslında hiçbir şey döndürmez. Sadece listeyi günceller.

ATO'nun dediği gibi yapabilirsiniz b = a[:index] + [obj] + a[index:]. Ancak başka bir yol şudur:

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

56
3 satırlık okunabilir koda tahammül edemiyorsanız, onu bir işleve koyun ve çağırın.
IceArdor

60

Performans açısından en verimli yaklaşım

Listedeki dilim indekslemesini kullanarak da öğeyi ekleyebilirsiniz . Örneğin:

>>> 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]

Belirli bir dizinde birden çok öğeyi birlikte eklemek için tek yapmanız gereken list, eklemek istediğiniz birden çok öğe kullanmaktır . Örneğin:

>>> 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]

Liste anlamayı kullanarak alternatif (ancak performans açısından çok yavaş) :

Alternatif olarak, liste anlama ile enumeratede elde edilebilir . (Ama lütfen bunu bu şekilde yapmayın. Bu sadece örnekleme içindir) :

>>> 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]

Tüm çözümlerin performans karşılaştırması

İşte timeitPython 3.4.5 1000 unsurların listesi ile tüm cevapların karşılaştırması:

  • Dilimlenmiş ekleme kullanarak mayın cevabı - En hızlı (döngü başına 3,08 µsn)

     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'nın dilimlenmiş listelerin birleştirilmesine dayanan kabul edilen cevabı - İkinci (döngü başına 6.71 µsn)

     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
    
  • Rushy Panchal'ın en çok oy kullanan cevabılist.insert(...) - Üçüncü (döngü başına 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
    
  • Benim cevabım ile Listesi Anlama veenumerateDördüncü - (çok yavaş döngü başına 168 mikro-saniyeye ile)

     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
Bu sonucu gerçekten seviyorum çünkü sorunu çözmek için kolayca genişletilebilir, ya değerleri 3, 3.5listeye (sırayla) eklemek istersem -> a[2:2] = [3,3.5]. Çok temiz
minillinim

1
[2: 2] = a_list nasıl çalışır? a [2: 2] temelde 2. indeksten 1. indekse (2-1) başlar, ancak ileriye doğru, boş bir [] listesi anlamına gelir. Nasıl uzar? [2: 3: -1] yaparsak işe yaramaz.
SamCodes

Mükemmel cevap. En iyi seçimin karmaşıklığının O (1) olup olmadığını merak ediyorum. Öyleyse neden?
Lerner Zhang

Bu cevabın güncellenmesi gerekiyor. Bir kez olsun, rapor edilen zamanlamaları Python 3.4 ile bile yeniden oluşturamıyorum ( list.insertve dilim ataması arasında bir faktör 2 elde ediyorum ) ve Python 3.8'de bu fark tamamen ortadan kalktı. Bir öğeyi eklemenin en net yolu list.insert, tabii ki kullanmaktır .
a_guest

39

Elimdeki en kısa: 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]

Kod satırlarının sayısı, kod kalitesinin iyi bir ölçüsü değildir. Bu yaklaşım hem performans hem de okunabilirlik nedeniyle kusurludur.
a_guest

0

En temiz yaklaşım, listeyi kopyalamak ve ardından nesneyi kopyaya eklemektir. Python 3'te bu şu şekilde yapılabilir list.copy:

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

Python 2'de liste kopyalama yoluyla elde edilebilir new = old[:](bu aynı zamanda Python 3'te de çalışır).

Performans açısından önerilen diğer yöntemlerden hiçbir farkı yoktur:

$ 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

Kullanım Python liste insert () yöntemini . Kullanım:

#Sözdizimi

İnsert () yönteminin sözdizimi -

list.insert(index, obj)

#Parameters

  • index - Nesnenin eklenmesi gereken dizindir.
  • obj - Bu, verilen listeye eklenecek Nesnedir.

# Dönüş Değeri Bu yöntem herhangi bir değer döndürmez, ancak verilen öğeyi verilen dizine ekler.

Misal:

a = [1,2,4,5]

a.insert(2,3)

print(a)

İadeler [1, 2, 3, 4, 5]


2
Bu soruya cevap vermiyor.
Gustav Bertram

5
Soru spesifikti: Is there anyway I can get the updated list as result, instead of updating the original list in place?Cevabınız tam tersini yapıyor.
Laszlowaty
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.