Buat daftar kosong dengan python dengan ukuran tertentu

546

Saya ingin membuat daftar kosong (atau apa pun cara terbaik) yang dapat menampung 10 elemen.

Setelah itu saya ingin menetapkan nilai dalam daftar itu, misalnya ini seharusnya menampilkan 0 hingga 9:

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

print  s1

Tetapi ketika saya menjalankan kode ini, itu menghasilkan kesalahan atau dalam kasus lain hanya menampilkan [](kosong).

Adakah yang bisa menjelaskan mengapa?

Ronaldinho Pelajari Pengodean
sumber
7
"Daftar kosong" ( []) menurut definisi memiliki nol elemen. Apa yang Anda tampaknya inginkan adalah daftar nilai falsy seperti None, 0, atau ''.
dan04
Untuk menghasilkan daftar dari 0ke 9Anda harus benar-benar menggunakan for i in range(0, 10), yang artinya for (int i = 0, i < 10, i++).
Atcold

Jawaban:

833

Anda tidak dapat menetapkan ke daftar seperti lst[i] = something, kecuali daftar tersebut sudah diinisialisasi dengan setidaknya i+1elemen. Anda harus menggunakan append untuk menambahkan elemen ke akhir daftar. lst.append(something).

(Anda dapat menggunakan notasi penugasan jika Anda menggunakan kamus).

Membuat daftar kosong:

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

Menetapkan nilai ke elemen yang ada dari daftar di atas:

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

Ingatlah bahwa sesuatu seperti l[15] = 5masih akan gagal, karena daftar kami hanya memiliki 10 elemen.

range (x) membuat daftar dari [0, 1, 2, ... x-1]

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

Menggunakan fungsi untuk membuat daftar:

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

Pemahaman daftar (Menggunakan kotak karena untuk rentang Anda tidak perlu melakukan semua ini, Anda bisa kembali range(0,9)):

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]
Varunl
sumber
17
Apa yang Anda maksud dengan "Anda tidak dapat menetapkan ke daftar seperti lst [i] = sesuatu" - tentu saja Anda bisa! Apa yang tidak dapat Anda lakukan adalah menetapkan elemen yang tidak ada di luar panjang daftar saat ini
Sergey
5
"kecuali daftar sudah diinisialisasi dengan setidaknya saya + 1 elemen" ....
MrR
5
Anda dapat melakukan ini:a = [0 for _ in range(10)]
Kamiar
Apakah mungkin untuk melakukan ini menggunakan fungsi list ()?
Raul Chiarella
126

Coba ini sebagai gantinya:

lst = [None] * 10

Di atas akan membuat daftar ukuran 10, di mana setiap posisi diinisialisasi None. Setelah itu, Anda dapat menambahkan elemen ke dalamnya:

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

Diakui, itu bukan cara Pythonic untuk melakukan sesuatu. Lebih baik lakukan ini:

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

Atau bahkan lebih sederhana , dengan Python 2.x Anda dapat melakukan ini untuk menginisialisasi daftar dengan nilai dari 0 hingga 9:

lst = range(10)

Dan dengan Python 3.x:

lst = list(range(10))
Óscar López
sumber
2
Hal hebat lainnya tentang ini adalah Anda dapat menginisialisasi daftar dengan nilai default. lst = [''] * 10ataulst = [0] * 10
Anthony Manning-Franklin
2
Varian pada contoh pemahaman. Jika semua elemen dalam kebutuhan array yang kosong di inisialisasi, gunakan: arr = [None for _ in range(10)].
Doug R.
86

Jawaban varunl saat ini diterima

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

Bekerja dengan baik untuk jenis non-referensi seperti angka. Sayangnya jika Anda ingin membuat daftar-daftar-Anda akan mengalami kesalahan referensi. Contoh dalam Python 2.7.6:

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

Seperti yang Anda lihat, setiap elemen menunjuk ke objek daftar yang sama. Untuk menyiasatinya, Anda dapat membuat metode yang akan menginisialisasi setiap posisi ke referensi objek yang berbeda.

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

Kemungkinan besar ada cara python bawaan untuk melakukan ini (alih-alih menulis fungsi), tapi saya tidak yakin apa itu. Dengan senang hati akan dikoreksi!

Sunting: Ini [ [] for _ in range(10)]

Contoh:

>>> [ [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]]
James L.
sumber
19
Saya mendengar bahwa menggunakan appendsangat sering lebih rendah daripada pemahaman daftar. Anda dapat membuat daftar daftar via [ [] for _ in range(10)].
M.Herzkamp
10
Terpilih karena saya marah karena saya memiliki array multi-dimensi dengan data yang sama diulang beberapa kali dan tidak dapat menemukan apa yang terjadi sebelum akhirnya menemukan jawaban ini. ^^ Saya tidak mengerti mengapa hal ini sangat rendah di sini.
Bregalad
19

Anda dapat .append(element)ke daftar, misalnya: s1.append(i). Apa yang saat ini Anda coba lakukan adalah mengakses elemen ( s1[i]) yang tidak ada.

Mohammed Hossain
sumber
16

Ada dua metode "cepat":

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

Tampaknya [None]*xlebih cepat:

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

Tetapi jika Anda setuju dengan rentang (mis. [0,1,2,3,...,x-1]), Maka range(x)mungkin yang tercepat:

>>> timeit("range(100)",number=10000)
0.012513160705566406
mgoldwasser
sumber
Perhatikan bahwa dalam Python3 Anda harus menggunakan list(range(n))sebagai gantinya, karena range()tidak mengembalikan daftar tetapi merupakan iterator, dan itu tidak lebih cepat dari [None] * n.
Skillmon suka topanswers.xyz
10

Saya terkejut tidak ada yang menyarankan pendekatan sederhana ini untuk membuat daftar daftar kosong. Ini adalah utas lama, tetapi hanya menambahkan ini untuk kelengkapan. Ini akan membuat daftar 10 daftar kosong

x = [[] for i in range(10)]
Busur
sumber
7
Perbedaan paling penting antara melakukan di atas vs melakukan x = [[]] * 10adalah bahwa di yang terakhir, setiap elemen dalam daftar menunjuk ke objek daftar SAMA . Jadi kecuali Anda hanya ingin 10 salinan dari objek yang sama, gunakan rangevarian berbasis karena itu membuat 10 objek baru . Saya menemukan perbedaan ini sangat penting.
Mandeep Sandhu
6

(Ini ditulis berdasarkan versi asli dari pertanyaan.)

Saya ingin membuat daftar kosong (atau apa pun cara terbaik) dapat menampung 10 elemen.

Semua daftar dapat menampung elemen sebanyak yang Anda suka, hanya tunduk pada batas memori yang tersedia. Satu-satunya "ukuran" dari daftar yang penting adalah jumlah elemen yang ada di dalamnya.

tetapi ketika saya menjalankannya, hasilnya adalah []

print display s1bukan sintaks yang valid; berdasarkan deskripsi Anda tentang apa yang Anda lihat, saya anggap Anda maksudkandisplay(s1) lalu print s1. Agar itu dapat berjalan, Anda harus sudah mendefinisikan global s1untuk masuk ke fungsi.

Panggilan displaytidak mengubah daftar yang Anda masukkan, seperti yang tertulis. Kode Anda mengatakan "s1 adalah nama untuk hal apa pun yang diteruskan ke fungsi; ok, sekarang hal pertama yang akan kita lakukan adalah melupakan hal itu sepenuhnya, dan mari kita s1mulai merujuk sebagai gantinya ke yang baru dibuat list. Sekarang kita akan memodifikasi itu list". Ini tidak berpengaruh pada nilai yang Anda masukkan.

Tidak ada alasan untuk memberikan nilai di sini. (Tidak ada alasan nyata untuk membuat fungsi, tapi itu intinya.) Anda ingin "membuat" sesuatu, jadi itu adalah output dari fungsi Anda. Tidak diperlukan informasi untuk membuat hal yang Anda gambarkan, jadi jangan berikan informasi apa pun. Untuk mengeluarkan informasi, returnitu.

Itu akan memberi Anda sesuatu seperti:

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

Masalah berikutnya yang akan Anda perhatikan adalah bahwa daftar Anda sebenarnya hanya memiliki 9 elemen, karena titik akhir dilewati oleh rangefungsi. (Sebagai catatan tambahan, []berfungsi sama baiknya dengan list(), tanda titik koma tidak perlu, s1adalah nama yang buruk untuk variabel, dan hanya satu parameter yang diperlukan untuk rangejika Anda memulai 0.) Jadi, Anda berakhir dengan

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

Namun, ini masih meleset dari sasaran; rangebukan kata kunci ajaib yang merupakan bagian dari bahasa fordan caradef yang, melainkan itu fungsi. Dan coba tebak fungsi apa yang dikembalikan? Itu benar - daftar bilangan bulat itu. Jadi seluruh fungsi runtuh

def create_list():
    return range(10)

dan sekarang Anda mengerti mengapa kita tidak perlu menulis fungsi sendiri sama sekali; rangesudah fungsi yang kita cari. Meskipun, sekali lagi, tidak perlu atau alasan untuk "pra-ukuran" daftar.

Karl Knechtel
sumber
4

Salah satu cara sederhana untuk membuat matriks ukuran 2D nmenggunakan pemahaman daftar bersarang:

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

Saya sedikit terkejut bahwa cara termudah untuk membuat daftar yang diinisialisasi adalah tidak ada dalam jawaban ini. Cukup gunakan generator dalam listfungsi:

list(range(9))
Igor Rodriguez
sumber
1
Agak penasaran kenapa ada yang mengomentari yang satu ini ... Saya python noob dan saya yang ini sepertinya cara yang harus dilakukan, tetapi tidak ada yang mengatakan apa-apa. Mungkin fungsi rentang bisa mahal atau apa?
AFP_555
3
Masalah ini adalah jawaban ini tidak membuat daftar kosong sesuai pertanyaan, Anda akan berakhir dengan [0, 1, 2, 3, 4, 5, 6, 7, 8] yang merupakan fungsi rentang (9) . Dengan asumsi instantiating daftar Nones berguna daripada mengisinya dengan angka segera
Spcogg yang kedua
Mengapa membungkus range(9)di list()? Belum range(9)mengembalikan daftar?
Zyl
2
@Zyl rangebukan daftar, atau generator. Ini adalah subkelas abadi bawaan dari Sequence.
Nuno André
1
@ AFP_555 Saya pikir pertanyaan sebenarnya adalah mengapa itu tidak lebih dipilih, karena tidak benar-benar menjawab pertanyaan dan dapat memiliki konsekuensi buruk yang tidak diinginkan.
eric
1

Inilah kode saya untuk daftar 2D dalam python yang akan membaca no. baris dari input:

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('')
Amit Prafulla
sumber
0

Jawaban yang diterima memiliki beberapa gotcha. Sebagai contoh:

>>> a = [{}] * 3
>>> a
[{}, {}, {}]
>>> a[0]['hello'] = 5
>>> a
[{'hello': 5}, {'hello': 5}, {'hello': 5}]
>>> 

Jadi setiap kamus mengacu pada objek yang sama. Hal yang sama berlaku jika Anda menginisialisasi dengan array atau objek.

Anda bisa melakukan ini sebagai gantinya:

>>> b = [{} for i in range(0, 3)]
>>> b
[{}, {}, {}]
>>> b[0]['hello'] = 6
>>> b
[{'hello': 6}, {}, {}]
>>> 
pengguna2233706
sumber
-2

Saya menemukan pertanyaan SO ini sambil mencari masalah yang sama. Saya harus membangun array 2D dan kemudian mengganti beberapa elemen dari setiap daftar (dalam array 2D) dengan elemen dari dict. Saya kemudian datang di ini pertanyaan SO yang membantu saya, mungkin ini akan membantu pemula lainnya untuk berkeliling. Trik kuncinya adalah menginisialisasi array 2D sebagai array numpy dan kemudian menggunakan array[i,j]bukan array[i][j].

Untuk referensi, ini adalah potongan kode tempat saya harus menggunakan ini:

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)

Sekarang saya tahu kita bisa menggunakan pemahaman daftar tetapi untuk kesederhanaan saya menggunakan nested for loop. Semoga ini bisa membantu orang lain yang menemukan posting ini.

Sanjay Krishna
sumber
-2

Jadikan itu lebih dapat digunakan kembali sebagai suatu fungsi.

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
Kardi Teknomo
sumber
-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

Untuk membuat daftar, cukup gunakan tanda kurung ini: "[]"

Untuk menambahkan sesuatu ke daftar, gunakan list.append ()

Force Fighter
sumber
-3

Kode ini menghasilkan array yang berisi 10 angka acak.

import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)
Akram Saeed
sumber
3
Selamat datang di SO. Jawaban Anda tidak benar-benar menjawab pertanyaan secara spesifik. Lihatlah stackoverflow.com/help/how-to-answer
Nick