Bir öğe listenin içine mi taşınsın?


105

Python'da, bir öğeyi bir listedeki belirli bir dizine nasıl taşıyabilirim?

Yanıtlar:


160

insertBir liste yöntemini kullanın :

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

Alternatif olarak, bir dilim gösterimi de kullanabilirsiniz:

l[index:index] = [item]

Listede zaten bulunan bir öğeyi belirtilen konuma taşımak istiyorsanız, onu silmeniz ve yeni konuma eklemeniz gerekir:

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

22
Listenin önüne veya arkasına doğru ilerliyor olmanıza bağlı olarak, zaten bir listede bulunan bir öğeyi ekle / çıkar yöntemiyle taşımanın farklı davranışları olacağını unutmayın. Sola doğru hareket ederek, seçtiğiniz nesnenin önüne eklersiniz. Seçtiğiniz öğeden sonra eklediğiniz arkaya geçme. Listenin sonuna gitmeyi kontrol edin (dizin hatası).
MKaras

Birden çok öğe nasıl taşınır? Bir liste verildiğinde a = [1,2,3,4,5,6,7,8,9], nasıl [1,2, [3,4,5], 6,7,8,9 ]? Bu tek adımda veya bir liste kavrayışıyla yapılabilir mi?
g33kz0r

@MKaras Bunu Python 3.5 ile test ettim ve last index + 1hatasız ekleyebiliyorsunuz . Bu durumda öğe listeye eklenir.
user2061057

@ user2061057 doğru :) büyük dizinler bile sonunda eklenen şeylerle sonuçlanacaktır. a.insert(99999, 1) In [14]: a Out[14]: [...., 1]
lee penkman

1
Sonunda öğeyi eklemek için -1 indeksini kullanmaya çalışanlar için bunun yerine len (l) kullanmalısınız.
nda

32

Öğeyi herhangi bir yere değil, yalnızca sonuna kadar hareket ettiren biraz daha kısa bir çözüm şudur:

l += [l.pop(0)]

Örneğin:

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

13
Sen de kullanabilirsin l.append(l.pop(0)). Sadece marjinal olarak daha uzun, ama çok daha okunaklı.
coredumperror

Bunun yerine onu başlangıca nasıl taşıyabilirim?

21

Öğenin konumunu bilmiyorsanız, önce dizini bulmanız gerekebilir:

old_index = list1.index(item)

sonra hareket ettirin:

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

veya IMHO daha temiz bir yol:

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

6
Sanırım ifadenize alay etmekte haklıyım pass... istisnaları asla gizleme - bunun gibi bir örnekteki varsayılan şey daha temiz bir hata ifadesi veya baskı ifadesi sağlamak olmalıdır ... raise ValueError(f'Unable to move item to {new_index}')veya print(f'Moving item to {new_index} failed. List remains unchanged.'). Belki passbir işlev çağrıldığında try_to_move_itemveya bir şeyde işlemin sessizce başarısız olabileceği anlaşılırsa tamam olurdu .
flutefreak7

3

Çok basit bir çözüm, ancak orijinal konumun dizinini ve yeni konumun dizinini bilmeniz gerekir:

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

8
Bu bir takas, hamle değil.
juzzlin

0

Timeit ile aynı listedeki bir öğeyi taşımak için birkaç yöntemin profilini çıkardım. J> i ise kullanılacak olanlar şunlardır:

┌──────────┬──────────────────────┐
│ 14,4usec │ x [i: i] = x.pop (j), │
│ 14.5usec │ x [i: i] = [x.pop (j)] │
│ 15,2usec │ x.insert (i, x.pop (j)) │
└──────────┴──────────────────────┘

ve burada j <= i ise kullanılacak olanlar:

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

Yalnızca birkaç kez kullanırsanız çok büyük bir fark olmaz, ancak manuel sıralama gibi ağır şeyler yaparsanız, en hızlı olanı almak önemlidir. Aksi takdirde, en okunabilir olduğunu düşündüğünüz birini almanızı öneririm.

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.