Python'da belirli boyutta boş bir liste oluşturun


545

Ben 10 öğe tutabilir boş bir liste (veya en iyi yolu ne olursa olsun) oluşturmak istiyorum.

Bundan sonra bu listede değerler atamak istiyorum, örneğin bu 0 ila 9 göstermesi gerekiyor:

s1 = list();
for i in range(0,9):
   s1[i] = i

print  s1

Ama bu kodu çalıştırdığımda, bir hata üretir veya başka bir durumda sadece [](boş) görüntüler .

Birisi nedenini açıklayabilir mi?



7
[]Tanımı gereği "boş liste" ( ) sıfır öğeye sahiptir. Ne görünüşte istediğiniz falsy gibi bir değerler listesi None, 0veya ''.
dan04

Bir liste oluşturmak için 0için 9aslında kullanmalısınız for i in range(0, 10)hangi araçları for (int i = 0, i < 10, i++).
Atcold

Yanıtlar:


830

lst[i] = somethingListe zaten en azından i+1öğelerle başlatılmadıkça, gibi bir listeye atayamazsınız . Listenin sonuna öğe eklemek için append komutunu kullanmanız gerekir. lst.append(something).

(Sözlük kullanıyorsanız ödev notasyonunu kullanabilirsiniz).

Boş bir liste oluşturma:

>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

Yukarıdaki listenin mevcut bir öğesine bir değer atama:

>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]

l[15] = 5Listemizde sadece 10 öğe olduğu için, benzer bir şeyin hala başarısız olacağını unutmayın .

aralık (x) [0, 1, 2, ... x-1] 'den bir liste oluşturur

# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Liste oluşturmak için bir işlev kullanma:

>>> def display():
...     s1 = []
...     for i in range(9): # This is just to tell you how to create a list.
...         s1.append(i)
...     return s1
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Liste anlama (Kareleri kullanarak, çünkü aralık için tüm bunları yapmanız gerekmez, sadece geri dönebilirsiniz range(0,9)):

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]

17
Ne demek "lst [i] = bir şey" gibi bir listeye atayamazsınız - tabii ki yapabilirsiniz!
Sergey

5
"liste zaten en az i + 1
öğeyle

5
Bunu yapabilirsiniz:a = [0 for _ in range(10)]
Kamiar

List () işlevini kullanarak bunu yapmak mümkün müdür?
Raul Chiarella

125

Bunun yerine şunu deneyin:

lst = [None] * 10

Yukarıda, her bir konumun başlatıldığı 10 büyüklüğünde bir liste oluşturulur None. Bundan sonra, ona öğeler ekleyebilirsiniz:

lst = [None] * 10
for i in range(10):
    lst[i] = i

Kuşkusuz, bu bir şeyler yapmanın Pythonic yolu değil. Bunu yapsak iyi olur:

lst = []
for i in range(10):
    lst.append(i)

Veya daha da basit , Python 2.x'te, 0'dan 9'a kadar değerlere sahip bir liste başlatmak için bunu yapabilirsiniz:

lst = range(10)

Ve Python 3.x'te:

lst = list(range(10))

2
Bununla ilgili diğer harika şey, bir listeyi varsayılan değerlerle başlatabilmenizdir. lst = [''] * 10veyalst = [0] * 10
Anthony Manning-Franklin

2
Anlama örneğinde bir varyant. Dizi ihtiyacı olan tüm elemanlar başlatma boş olarak, kullanmak: arr = [None for _ in range(10)].
Doug

85

varunl'un şu anda kabul edilen cevabı

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

Sayılar gibi referans olmayan türler için iyi çalışır. Maalesef bir liste listesi oluşturmak istiyorsanız, referanslama hatalarıyla karşılaşacaksınız. Python 2.7.6'daki örnek:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

Gördüğünüz gibi, her öğe aynı liste nesnesini işaret ediyor. Bu sorunu aşmak için, her konumu farklı bir nesne başvurusuna başlatacak bir yöntem oluşturabilirsiniz.

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

Muhtemelen bunu yapmanın varsayılan, yerleşik bir python yolu vardır (bir işlev yazmak yerine), ama ne olduğundan emin değilim. Düzeltilmiş olmaktan mutluluk duyarız!

Düzenleme: [ [] for _ in range(10)]

Misal :

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]

19
appendDuyguları listelemek için çok sık kullanmanın daha düşük olduğunu duydum . Yoluyla liste listenizi oluşturabilirsiniz [ [] for _ in range(10)].
M.Herzkamp

10
Ben birkaç kez tekrarlanan aynı verilerle çok boyutlu dizi vardı ve nihayet bu cevap bulamadan önce ne olduğunu anlayamadım çünkü deli alıyorum çünkü. ^ ^ Neden bu kadar düşük olduğunu anlamıyorum.
Bregalad

19

Sen edebilir .append(element)liste, örn: s1.append(i). Şu anda yapmaya çalıştığınız şey, var olmayan bir elemente ( s1[i]) erişmek .


16

İki "hızlı" yöntem vardır:

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

Daha [None]*xhızlı görünüyor :

>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605

Ancak bir aralıkla (örneğin [0,1,2,3,...,x-1]) iyi range(x)durumdaysanız, en hızlı olabilir:

>>> timeit("range(100)",number=10000)
0.012513160705566406

Python3'te list(range(n))bunun yerine range()bir liste döndürmüyor, ancak bir yineleyici kullanmanız gerekeceğini ve bunun daha hızlı olmadığını unutmayın [None] * n.
Skillmon topanswers.xyz'i seviyor

10

Kimse boş listelerin bir listesini oluşturmak için bu basit yaklaşımı önermediğine şaşırdım. Bu eski bir iş parçacığıdır, ancak bunu tamlık için ekliyoruz. Bu 10 boş listenin bir listesini oluşturacaktır

x = [[] for i in range(10)]

7
Yukarıdakileri yapmak ile yukarı arasındaki en önemli fark x = [[]] * 10, ikincisinde listedeki her öğenin AYNI liste nesnesini işaret etmesidir . Dolayısıyla, aynı nesnenin 10 kopyasını istemiyorsanız, rangetemel varyantı 10 yeni nesne oluştururken kullanın . Bu ayrımı çok önemli buldum.
Mandeep Sandhu

6

(Bu, sorunun orijinal sürümüne göre yazılmıştır.)

Boş bir liste oluşturmak istiyorum (ya da en iyi yol ne olursa olsun) 10 element tutabilir.

Tüm listeler, yalnızca kullanılabilir bellek sınırına bağlı olarak, istediğiniz kadar öğe içerebilir. Önemli olan bir listenin tek "boyutu", o anda içinde bulunan öğelerin sayısıdır .

ama çalıştırdığımda sonuç []

print display s1geçerli bir sözdizimi değil; Ne gördüğünü açıklamasıyla dayalı Ne demek farz display(s1)sonra ve print s1. Bunun çalışması için, s1işleve geçmek üzere önceden bir global tanımlamış olmanız gerekir .

Arama display, yazdığınız şekilde geçtiğiniz listeyi değiştirmez. Kodunuz, " s1işleve iletilen her şeyin adıdır; Tamam, şimdi yapacağımız ilk şey bu şeyi tamamen unutmak ve s1bunun yerine yeni oluşturulan bir öğeye başvurmaya başlayalım list. Şimdi bunu değiştireceğiz list". Bunun, ilettiğiniz değer üzerinde bir etkisi yoktur.

Burada bir değer geçirmek için hiçbir neden yok. (Bir işlev oluşturmak için gerçek bir neden yoktur, ama bu konunun yanındadır.) Bir şey "yaratmak" istiyorsunuz, bu nedenle işlevinizin çıktısı budur. Açıkladığınız şeyi oluşturmak için herhangi bir bilgi gerekmez, bu nedenle herhangi bir bilgiyi iletmeyin. Bilgi almak için bu bilgiyi kullanın return.

Bu size şöyle bir şey verir:

def display():
    s1 = list();
    for i in range(0, 9):
        s1[i] = i
    return s1

Dikkat edeceğiniz bir sonraki sorun, listenin aslında sadece 9 öğeye sahip olacağıdır, çünkü bitiş noktası rangeişlev tarafından atlanır . (Yan notlarda []olduğu gibi list(), noktalı virgül gereksizdir, s1değişken için zayıf bir isimdir ve rangeeğer başlıyorsanız sadece bir parametre gereklidir 0.) Böylece

def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result

Ancak, bu işaret hala eksik; rangeyolu dilin parçası sihirli anahtar kelime değildir forve deffakat bunun yerine bir fonksiyon. Ve tahmin et bu fonksiyon neyi döndürüyor? Bu doğru - bu tam sayıların listesi. Böylece tüm fonksiyon

def create_list():
    return range(10)

ve şimdi neden kendimize bir fonksiyon yazmak zorunda olmadığımızı görüyorsunuz; rangezaten aradığımız fonksiyon. Yine de, listeyi "önceden boyutlandırmaya" gerek yoktur.


4

Başlatılmış bir liste oluşturmanın en kolay yolunun bu cevapların hiçbirinde olmaması biraz şaşırdı. İşlevde bir jeneratör kullanın list:

list(range(9))

1
Neden kimse bu konuda henüz yorum merak biraz ... Ben bir python noob ve ben bu gitmek için bir yol gibi görünüyor, ama kimse bir şey söylemiyor. Belki de aralık işlevi pahalı olabilir mi?
AFP_555

3
Bu sorun, bu cevabın soru başına boş bir liste oluşturmaması, sonuç olarak aralık (9) işlevinin yaptığı [0, 1, 2, 3, 4, 5, 6, 7, 8] ile sonuçlanacaksınız. . Bir
Nones

Neden wrap range(9)in list()? Does not range(9)zaten listesini döndürür?
Zyl

2
@Zyl rangebir liste veya bir jeneratör değildir. Bu yerleşik bir değişmez alt sınıftır Sequence.
Nuno André

@ AFP_555 Bence asıl soru neden soruyu daha fazla düşürmüyor, çünkü soruyu gerçekten cevaplamıyor ve istenmeyen kötü sonuçlar doğurabiliyor.
eric

4

nİç içe liste kavramalarını kullanarak 2B boyutta bir matris oluşturmanın basit bir yolu :

m = [[None for _ in range(n)] for _ in range(n)]

1

İşte python 2B listesi için kodumu okuyacaktı. girişteki satır sayısı:

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')

-2

Benzer bir problem ararken bu SO sorusuna rastladım. Ben bir 2D dizi oluşturmak ve daha sonra bir dict öğeleri ile her listenin (2D dizi) bazı unsurları değiştirmek zorunda kaldı. Sonra geldi bu belki toparlamaya diğer başlayanlar yardımcı olacaktır, bana yardımcı SO soru. Anahtar numara 2D diziyi sayısal bir dizi olarak başlatmak ve sonra array[i,j]yerine kullanmaktı array[i][j].

Referans için bu kod bu kullanmak zorunda kaldı parçası:

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

Artık liste kavrayışını kullanabileceğimizi biliyorum ama basitlik uğruna iç içe bir döngü kullanıyorum. Umarım bu yazıya rastlayan başkalarına yardımcı olur.


-2

Bir işlev olarak daha fazla kullanılabilir hale getirin.

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length

-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

Bir liste oluşturmak için şu köşeli parantezleri kullanın: "[]"

Listeye bir şeyler eklemek için list.append () öğesini kullanın


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.