Bir Python listesinin, öğelerinin girildikleri sırada kalması garanti ediliyor mu?


318

Aşağıdaki Python kodum varsa

>>> x = []
>>> x = x + [1]
>>> x = x + [2]
>>> x = x + [3]
>>> x
[1, 2, 3]

Will xhep olması garanti [1,2,3]veya geçici elemanların diğer sıralamalar da mümkündür?

Yanıtlar:


479

Evet, bir python listesindeki öğelerin sırası kalıcıdır.


17
Bu doğru cevap, bu yüzden başka bir tane eklemek istemiyorum. Listesini de kullanabilir. Zihnini gerçekten rahatlatmak için ekleyin. docs.python.org/2/tutorial/datastructures.html
NG.

1
bir işlevden yerel bir liste döndürürsem ve çağıran işlevde bunu kullanırsam ne olur? Bu def fn_1(): lst = [] lst.append(1) lst.append(2) return lstve def fn_2(): print(fn_1())sipariş kaç kere veya nerede fn_1 () kullandığımdan bağımsız olarak DAİMA aynı mı olacak?
TheCuriousOne

6
Evet, bir python listesindeki öğelerin sırası kalıcıdır. ;)
sge

82

Kısacası, evet, düzen korunur. Uzun:

Genel olarak aşağıdaki tanımlar daima listeler gibi nesneler için geçerlidir:

Bir liste yinelenen unsurları içeren ve açıkça bunu yapmak için yapılmış sürece genellikle değişmemesini için belirli bir düzen vardır edebilir elemanların topluluğudur. yığınlar ve kuyruklar , öğe eklemek ve kaldırmak için belirli (genellikle sınırlı) davranış sağlayan liste türleridir (yığınlar LIFO, sıralar FIFO'dur). Listeler, şeylerin listelerinin pratik temsilleridir. Bir dize, sıralamanın önemli ( "abc" != "bca") olduğu ve dizenin içeriğindeki kopyalara kesinlikle izin verildiğinden (var "aaa"olabilir ve != "a") karakterlerin bir listesi olarak düşünülebilir .

Bir küme , kopyaları içeremeyen ve zaman içinde değişebilen veya değişmeyen kesin olmayan bir sıraya sahip öğelerden oluşan bir koleksiyondur. Kümeler , belirli bir şey seçiminin kapsamını tanımladıkları kadar şeylerin listesini temsil etmez . Kümenin iç yapısı, elemanlarının birbirine göre nasıl depolandığı, genellikle yararlı bilgiler taşımak anlamına gelmez. Bazı uygulamalarda, kümeler her zaman dahili olarak sıralanır; diğerlerinde sıralama basitçe tanımsızdır (genellikle bir karma fonksiyonuna bağlıdır).

Koleksiyon , (genellikle değişken) başka sayıda nesneyi depolamak için kullanılan herhangi bir nesneye atıfta bulunan genel bir terimdir. Hem listeler hem de kümeler bir koleksiyon türüdür. Tuples ve Diziler normalde koleksiyon olarak kabul edilmez. Bazı diller de haritaları (farklı nesneler arasındaki ilişkileri tanımlayan kapsayıcılar) bir tür toplama olarak görür.

Bu adlandırma düzeni, Python, C ++, Java, C # ve Lisp (sıralarını tutmayan listelerin özellikle felaket olacağı) dahil olmak üzere bildiğim tüm programlama dilleri için geçerlidir. Eğer kimse durumun böyle olmadığını biliyorsa, lütfen sadece söyleyin, cevabımı düzenleyeceğim. Belirli uygulamaların bu nesneler için C ++ ' da vektör ve ALGOL 68'de flex gibi diğer adları kullanabileceğini unutmayın (her iki liste; flex teknik olarak yalnızca yeniden boyutlandırılabilir bir dizidir).

İşaretin +burada nasıl çalıştığına dair ayrıntılar nedeniyle sizin durumunuzda herhangi bir karışıklık varsa , siparişin listeler için önemli olduğunu bilin ve aksi takdirde inanmak için çok iyi bir neden yoksa, liste işlemlerinin düzeni koruduğunu hemen hemen her zaman güvenle kabul edebilirsiniz. . Bu durumda, +işaret, dizeler için olduğu gibi davranır (gerçekten de sadece karakter listeleridir): bir listenin içeriğini alır ve bir başkasının içeriğinin arkasına yerleştirir.

Eğer sahipsek

list1 = [0, 1, 2, 3, 4]
list2 = [5, 6, 7, 8, 9]

Sonra

list1 + list2

Aynıdır

[0, 1, 2, 3, 4] + [5, 6, 7, 8, 9]

Hangi değerlendirir

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Çok gibi

"abdcde" + "fghijk"

üretir

"abdcdefghijk"

1
Bir yerde bir JSON dizisi belirtimi dizileri korumak sipariş dizisi işlemleri sipariş korumak için garanti edilmez belirtmediği bir yerde okudum. Yine de bunun kaynağını bulamıyorum. Ve bir Dizinin temel yapısı hala numaralandırılmış dizinlere sahip özel bir nesne örneği, bu yüzden ifadenize bir çelişki değil, sadece ilginç bir tidbit, diye düşündüm.
Multihunter

1
Kümenin açıklamasına katılmıyorum. Kümeler kesinlikle "gerçek hayattan daha matematiksel ve teorik amaçlara yönelik değildir". Bunun yerine, kümeler, tekrarlanamayan öğeleri içeren bir koleksiyona ihtiyaç duyduğunda çok yararlıdır ve gerçek yaşam kullanım örneklerini modellemede yararlı olan fark ve kavşak gibi araçlar sunar.
Pintun

1
@Pintun bu yazıyı yazdıktan birkaç yıl sonra geriye baktığımda sana katılıyorum. Neyi hedeflediğimi ifade etmenin daha iyi bir yolunu bulduğumda düzenleyeceğim.
ApproachingDarknessFish

5

'Kümeleri' ve 'listeleri' karıştırıyorsunuz. Bir küme düzeni garanti etmez, ancak listeler bunu garanti eder.

Setler süslü parantez kullanılarak bildirilir: {}. Buna karşılık, listeler köşeli parantez kullanılarak bildirilir: [].

mySet = {a, b, c, c}

Siparişi garanti etmez, ancak liste şunları yapar:

myList = [a, b, c]

1
Bir kümenin yinelememeyi de garanti ettiğini unutmayın . Bir listede yinelenen öğeler olabilir, bir kümede olmayabilir.
Nathaniel Ford

4

Sanırım ilginizi çekebilecek bir şey, girişlerin değişip değişmeyeceğidir, böylece 2 farklı bir sayı haline gelir. Zihninizi burada rahatlatabilirsiniz, çünkü Python'da tamsayı değişmez , yani oluşturulduktan sonra değişemezler.

Python'daki her şey değişmez değildir. Örneğin, listeler değiştirilebilir - oluşturulduktan sonra değişebilir. Örneğin, bir liste listeniz varsa

>>> a = [[1], [2], [3]]
>>> a[0].append(7)
>>> a
[[1, 7], [2], [3]]

Burada, ilk girişini değiştirdim a(ekledim 7). Biri etrafta bir şeyler karıştırmayı ve dikkatli değilseniz burada beklenmedik şeyler almayı hayal edebilir (ve aslında, Python'da bir şekilde programlamaya başladıklarında herkes böyle olur; sadece bu sitede arama yaparken " düzinelerce örneği görmek için).

Bir başka deyişle, değer işaret var x = x + [a]ve x.append(a)aynı şey değildir. İkincisi mutasyon geçirir xve ilki yeni bir liste oluşturur ve listeye atar x. Farkı görmek için, bir y = xşey eklemeden xve her birini denemeden önce ayarlamayı deneyin ve ikisinin yaptığı farka bakın y.


0

alist = [1,2,3]

I = 0

for item in aList:  

    if i<2:  

            aList.remove(item)  

    i+=1  

bir liste

[2]

Ahlaki, liste tarafından yönlendirilen bir döngüdeki bir listeyi değiştirirken iki adım alır:

aList=[1,2,3]
i=0
for item in aList:
    if i<2:
        aList[i]="del"
    i+=1

aList

['del', 'del', 3]
for i in range(2):
    del aList[0]

aList
[3]

0

Evet, sözlükler sipariş edilmezken listeler ve tuples her zaman sıralanır


1
Python 3 hariç: D
mbeacom
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.