Câu hỏi Tạo một danh sách rỗng trong python với kích thước nhất định


Tôi muốn tạo một danh sách trống (hoặc bất cứ cách nào là cách tốt nhất) có thể chứa 10 yếu tố.

Sau đó tôi muốn gán các giá trị trong danh sách đó, ví dụ điều này được cho là hiển thị từ 0 đến 9:

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

print  s1

Nhưng khi tôi chạy mã này, nó tạo ra một lỗi hoặc trong trường hợp khác nó chỉ hiển thị [] (trống).

Ai đó có thể giải thích lý do tại sao?


300
2018-05-23 00:38


gốc


có thể trùng lặp Khởi tạo một danh sách cho một số phần tử đã biết trong Python - lumbric
Một "danh sách trống" ([]) theo định nghĩa có 0 phần tử. Những gì bạn dường như muốn là một danh sách các giá trị giả như None, 0, hoặc là ''. - dan04
Để tạo danh sách từ 0 đến 9 bạn thực sự nên sử dụng for i in range(0, 10), nghĩa là for (int i = 0, i < 10, i++). - Atcold


Các câu trả lời:


Bạn không thể gán cho một danh sách như lst[i] = something, trừ khi danh sách đã được khởi tạo với ít nhất i+1 các yếu tố. Bạn cần sử dụng phụ thêm để thêm phần tử vào cuối danh sách. lst.append(something).

(Bạn có thể sử dụng ký hiệu gán nếu bạn đang sử dụng từ điển).

Tạo danh sách trống:

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

Gán một giá trị cho một phần tử hiện có của danh sách trên:

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

Hãy nhớ rằng một cái gì đó như l[15] = 5 vẫn sẽ thất bại, vì danh sách của chúng tôi chỉ có 10 yếu tố.

phạm vi (x) tạo danh sách từ [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]

Sử dụng hàm để tạo danh sách:

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

Danh sách hiểu (Sử dụng các ô vuông vì phạm vi bạn không cần phải làm tất cả điều này, bạn chỉ có thể trở lại range(0,9) ):

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

477
2018-05-23 00:44



Bạn có ý nghĩa gì bởi "Bạn không thể gán cho một danh sách như lst [i] = một cái gì đó" - tất nhiên bạn có thể! Những gì bạn không thể làm là gán cho một phần tử không tồn tại ngoài độ dài danh sách hiện tại - Sergey


Hãy thử thay vào đó:

lst = [None] * 10

Ở trên sẽ tạo ra một danh sách các kích thước 10, nơi mỗi vị trí được khởi tạo để None. Sau đó, bạn có thể thêm các phần tử vào nó:

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

Phải thừa nhận rằng, đó không phải là cách Pythonic để làm việc. Tốt hơn làm điều này:

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

Hoặc là thậm chí còn tốt hơn, sử dụng danh sách hiểu như thế này:

[i for i in range(10)]

84
2018-05-23 00:41



Điều tuyệt vời khác về điều này là bạn có thể khởi tạo một danh sách với các giá trị mặc định. lst = [''] * 10 hoặc là lst = [0] * 10 - Anthony Manning-Franklin
Một biến thể trên ví dụ hiểu. Nếu tất cả các phần tử trong mảng cần phải trống khi khởi tạo, hãy sử dụng: arr = [None for _ in range(10)]. - Doug R.


câu trả lời hiện tại của varunl

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

Hoạt động tốt cho các loại không tham chiếu như số. Thật không may nếu bạn muốn tạo danh sách các danh sách bạn sẽ chạy vào các lỗi tham chiếu. Ví dụ trong Python 2.7.6:

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

Như bạn có thể thấy, mỗi phần tử trỏ đến cùng một đối tượng danh sách. Để giải quyết vấn đề này, bạn có thể tạo một phương thức để khởi tạo từng vị trí cho một tham chiếu đối tượng khác nhau.

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

Có khả năng mặc định, được xây dựng trong python cách làm điều này (thay vì viết một chức năng), nhưng tôi không chắc chắn nó là gì. Sẽ rất vui khi được sửa chữa!

Chỉnh sửa: Đó là [ [] for _ in range(10)]

Thí dụ :

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

45
2017-11-04 03:39



Tôi nghe nói rằng sử dụng append thường rất kém so với việc hiểu danh sách. Bạn có thể tạo danh sách các danh sách của mình qua [ [] for _ in range(10)]. - M.Herzkamp
Được thăng hạng vì tôi phát điên vì tôi có mảng đa chiều với cùng một dữ liệu lặp đi lặp lại nhiều lần và không thể biết được điều gì đã xảy ra trước khi tìm ra câu trả lời này ^^ Tôi không hiểu tại sao nó lại quá thấp ở đây. - Bregalad


Bạn có thể .append(element) vào danh sách, ví dụ: s1.append(i). Những gì bạn đang cố gắng làm là truy cập một phần tử (s1[i]) không tồn tại.


16
2018-05-23 00:40





Có hai phương pháp "nhanh":

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

Có vẻ như [None]*x nhanh hơn:

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

Nhưng nếu bạn đồng ý với một phạm vi (ví dụ: [0,1,2,3,...,x-1]), sau đó range(x) có thể nhanh nhất:

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

10
2018-02-15 22:38





(Điều này được viết dựa trên phiên bản gốc của câu hỏi.)

Tôi muốn tạo một danh sách trống (hoặc bất cứ cách nào là cách tốt nhất) có thể chứa 10 yếu tố.

Tất cả các danh sách có thể chứa nhiều phần tử tùy thích, chỉ phụ thuộc vào giới hạn bộ nhớ khả dụng. "Kích thước" duy nhất của danh sách quan trọng là số lượng phần tử hiện tại trong đó.

nhưng khi tôi chạy nó, kết quả là []

print display s1 không phải là cú pháp hợp lệ; dựa trên mô tả của bạn về những gì bạn đang thấy, tôi cho rằng bạn có nghĩa là display(s1) và sau đó print s1. Để điều đó chạy, trước tiên bạn phải định nghĩa toàn cầu s1 để truyền vào hàm.

Đang gọi displaykhông sửa đổi danh sách bạn chuyển vào, như được viết. Mã của bạn nói "s1 là một cái tên cho bất cứ thứ gì được truyền vào hàm; ok, bây giờ điều đầu tiên chúng ta sẽ làm là quên điều đó hoàn toàn, và để s1 bắt đầu tham khảo để thay thế list. Bây giờ chúng ta sẽ sửa đổi điều đó list"Điều này không ảnh hưởng đến giá trị bạn đã chuyển vào.

Không có lý do gì để vượt qua một giá trị ở đây. (Không có lý do thực sự để tạo ra một hàm, hoặc là, nhưng đó là bên cạnh điểm.) Bạn muốn "tạo ra" một cái gì đó, vì vậy đó là đầu ra của hàm của bạn. Không có thông tin được yêu cầu để tạo ra những điều bạn mô tả, do đó, không vượt qua bất kỳ thông tin. Để có được thông tin, return nó.

Điều đó sẽ cung cấp cho bạn một cái gì đó như:

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

Vấn đề tiếp theo bạn sẽ lưu ý là danh sách của bạn thực sự sẽ chỉ có 9 phần tử, bởi vì điểm kết thúc bị bỏ qua bởi range chức năng. (Như ghi chú bên, [] hoạt động tốt như list(), dấu chấm phẩy là không cần thiết, s1 là tên nghèo cho biến và chỉ cần một tham số cho range nếu bạn bắt đầu từ 0.) Vì vậy, sau đó bạn kết thúc với

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

Tuy nhiên, điều này vẫn còn thiếu nhãn hiệu; range không phải là một số từ khóa kỳ diệu mà là một phần của ngôn ngữ theo cách for và def là, nhưng thay vào đó là một hàm. Và đoán xem hàm đó trả về cái gì? Đúng vậy - một danh sách các số nguyên đó. Vì vậy, toàn bộ chức năng sụp đổ

def create_list():
    return range(10)

và bây giờ bạn thấy tại sao chúng ta không cần phải viết một hàm gì đó; range đã là chức năng mà chúng tôi đang tìm kiếm. Mặc dù, một lần nữa, không có nhu cầu hoặc lý do để "kích thước trước" danh sách.


5
2018-05-23 00:50





Tôi ngạc nhiên không ai đề xuất phương pháp đơn giản này để tạo danh sách các danh sách trống. Đây là một chủ đề cũ, nhưng chỉ cần thêm này cho đầy đủ. Điều này sẽ tạo danh sách 10 danh sách trống

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

5
2017-12-11 07:14



Sự khác biệt quan trọng nhất giữa việc làm ở trên so với làm x = [[]] * 10 là sau này, mỗi phần tử trong danh sách trỏ đến đối tượng danh sách CÙNG. Vì vậy, trừ khi bạn chỉ muốn 10 bản sao của cùng một đối tượng, hãy sử dụng range dựa trên biến thể khi nó tạo ra 10 Mới các đối tượng. Tôi thấy sự khác biệt này rất quan trọng. - Mandeep Sandhu


Đây là mã của tôi cho danh sách 2D trong python mà sẽ đọc không. các hàng từ đầu vào:

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
2018-01-05 19:00





Thêm vào các câu trả lời tuyệt vời được viết ở trên,

Để chỉ tạo danh sách trống, được cho là sử dụng "số 0",

lst=[0]*size

1
2018-01-25 15:23





Tôi đã xem qua câu hỏi SO này trong khi tìm kiếm một vấn đề tương tự. Tôi đã phải xây dựng một mảng 2D và sau đó thay thế một số yếu tố của mỗi danh sách (trong mảng 2D) với các yếu tố từ một dict. Sau đó tôi bắt gặp điều này SO câu hỏi đã giúp tôi, có lẽ điều này sẽ giúp người mới bắt đầu để có được xung quanh. Bí quyết quan trọng là khởi tạo mảng 2D thành mảng có nhiều mảng và sau đó sử dụng array[i,j] thay vì array[i][j].

Để tham khảo, đây là đoạn mã mà tôi phải sử dụng:

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)

Bây giờ tôi biết chúng tôi có thể sử dụng danh sách hiểu nhưng vì lợi ích đơn giản tôi đang sử dụng một lồng nhau cho vòng lặp. Hy vọng điều này sẽ giúp những người khác đi qua bài đăng này.


0
2018-02-18 20:52