Có cách nào trong Python để khởi tạo mảng/danh sách đa chiều mà không sử dụng vòng lặp không?Khởi tạo mảng đa chiều Python mà không có vòng lặp
Trả lời
chắc có là một cách
arr = eval(`[[0]*5]*10`)
.210
hoặc
arr = eval(("[[0]*5]+"*10)[:-1])
nhưng nó kinh khủng và lãng phí, vì vậy tất cả mọi người sử dụng các vòng lặp (thường là danh sách comprehensions) hoặc NumPy
Đánh dấu là được chấp nhận là phản ánh tốt nhất câu hỏi. numpy không phải là một phần của cài đặt Python chuẩn. – Leonid
Điều này có nhược điểm khi tạo tham chiếu đến cùng một đối tượng, xem [câu trả lời này] (http://stackoverflow.com/a/3662548/393885) –
@black_puppydog, không có. Đó là lý do tại sao 'eval' được sử dụng ở đây –
Nó phụ thuộc vào những gì bạn cần khởi tạo mảng, nhưng chắc chắn. Bạn có thể sử dụng danh sách hiểu biết để tạo ra một mảng 5 × 3, ví dụ:
>>> [[0 for x in range(3)] for y in range(5)]
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> [[3*y+x for x in range(3)] for y in range(5)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]
Vâng, tôi cho rằng điều này vẫn có vòng — nhưng đó là tất cả được thực hiện trong một dòng, mà tôi đoán là ý nghĩa dự định của bạn câu hỏi?
Điều đó không được tính là sử dụng vòng lặp? –
Tài liệu chỉ định nó như một cách để khởi tạo danh sách đa chiều. Đối với một danh sách một chiều, khởi tạo sau đây là có thể 'list = [5] * 10', nhưng không thể làm cho nó hoạt động với nhiều thứ nguyên hơn. Có vẻ như khi bạn làm 'list = [[5] * 5] * 5', thì mỗi chiều phụ sẽ trỏ đến cùng một bộ nhớ, đó không phải là thứ tôi muốn. – Leonid
Chắc chắn, bạn chỉ có thể làm
mylist = [
[1,2,3],
[4,5,6],
[7,8,9]
]
Bạn hoàn toàn đúng, và tôi không hỏi làm thế nào mà sẽ tìm kiếm một ma trận 1000 X 1000 ... – Leonid
Tùy thuộc vào nhu cầu thực sự của bạn, de facto "chuẩn" gói Numpy có thể cung cấp cho bạn chính xác những gì bạn cần.
Bạn có thể ví dụ như tạo ra một mảng đa chiều với
numpy.empty((10, 4, 100)) # 3D array
(khởi tạo với giá trị tùy ý) hoặc tạo các mảng cùng với số không khắp mọi nơi với
numpy.zeros((10, 4, 100))
NumPy là rất nhanh, cho các hoạt động mảng.
Hm ... cả hai ví dụ này có tạo ra một mảng 10 x 4 x 100 không? –
Họ chắc chắn nhất làm. Bạn có thể kiểm tra điều này bằng cách thực hiện 'a = numpy.empty ((10, 4, 100)); in a.shape'. – EOL
Tôi không tin điều đó là có thể.
Bạn có thể làm một cái gì đó như thế này:
>>> a = [[0] * 5] * 5
để tạo ra một ma trận 5x5, nhưng nó được lặp lại đối tượng (mà bạn không muốn). Ví dụ:
>>> a[1][2] = 1
[[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]]
Bạn gần như chắc chắn cần phải sử dụng một số loại vòng lặp như trong:
[[0 for y in range(5)] for x in range(5)]
>>> a = [[0] * 5] * 5 Đó là một chút nguy hiểm cách .. có lẽ nó là tốt nếu bạn sử dụng số không. Nhưng nếu bạn cố gắng đặt biến đó vào đó. Bạn nhận danh sách các danh sách tham chiếu đến cùng một giá trị. ví dụ khi bạn đặt [1] [1] = 5 - tất cả danh sách sẽ có mục ở 1 vị trí là 5! – RredCat
Nếu bạn đang làm việc số sử dụng numpy, một cái gì đó giống như
x = numpy.zeros ((m,n))
x = numpy.ones ((m,n))
Đệ quy là bạn của bạn: D
Đó là một thực hiện khá ngây thơ nhưng nó hoạt động !
dim = [2, 2, 2]
def get_array(level, dimension):
if(level != len(dimension)):
return [get_array(level+1, dimension) for i in range(dimension[level])]
else:
return 0
print get_array(0, dim)
Đây chỉ là những gì tôi đã làm sau, cảm ơn!Lời nhắc duy nhất của tôi là tôi muốn gửi xuống một mảng chiều ngắn, thay vì hai tham số, như sau: [get_array (dimension [1:]) cho j trong xrange (dimension [0])] – Jaime
Python không có mảng. Nó có các loại trình tự khác nhau, từ danh sách đến từ điển mà không quên bộ - một trong những quyền phụ thuộc vào nhu cầu cụ thể của bạn.
Giả sử "mảng" của bạn thực sự là một danh sách, và "khởi tạo" có nghĩa là phân bổ một danh sách liệt kê của NxM yếu tố, bạn có thể (giả):
- cho N lần: cho M lần: thêm một yếu tố
- cho N lần: thêm một hàng của các nguyên tố M
- viết toàn bộ điều ra
bạn nói rằng bạn không muốn lặp và rằng những quy tắc ra linh sam st hai điểm, nhưng tại sao? Bạn cũng nói rằng bạn không muốn viết điều xuống (để đáp ứng với JacobM), vậy làm thế nào bạn sẽ chính xác làm điều đó? Tôi không biết cách nào khác để có được một cấu trúc dữ liệu mà không cần tạo ra nó trong các phần nhỏ hơn (lặp lại) hoặc viết nó xuống một cách rõ ràng - bằng bất kỳ ngôn ngữ lập trình nào.
Cũng xin lưu ý rằng danh sách được khởi tạo nhưng trống không tốt hơn là không có danh sách, trừ khi bạn đặt dữ liệu vào đó. Và bạn không cần phải khởi tạo nó trước khi đặt dữ liệu ...
Nếu đây không phải là bài tập lý thuyết, có lẽ bạn đang đặt câu hỏi sai. Tôi đề nghị bạn giải thích bạn cần làm gì với mảng đó.
Bạn sẽ thâm nhập sâu vào một số của các điểm :)) Điểm của câu hỏi là rất đơn giản và nó yêu cầu những gì nó yêu cầu. Tôi đã tự hỏi về các kỹ thuật khác nhau mà mọi người sử dụng để khởi tạo danh sách ** đa chiều ** và câu trả lời cho câu hỏi đó phản ánh hoàn toàn những gì tôi muốn biết. Một số người sử dụng thư viện Numpy tiêu chuẩn * de-facto *. Một số người khởi tạo danh sách bằng cách sử dụng 'for' vòng rõ ràng. Như * JacobM * cho thấy bạn có thể khởi tạo tĩnh các danh sách, nhưng tôi chỉ ra rằng nó không áp dụng cho các danh sách lớn. * gnibbler * cho thấy cách rất thú vị nhưng sôi nổi và không hiệu quả. – Leonid
Tôi đặc biệt băn khoăn về việc khởi tạo mà không có vòng lặp 'for', vì nó đã rõ ràng từ các tài liệu như thế nào bạn sẽ làm điều đó. – Leonid
a = [[]]
a.append([1,2])
a.append([2,3])
Sau đó
>>> a
[[1, 2], [2, 3]]
Sau đây không sử dụng bất kỳ thư viện đặc biệt, cũng không eval:
arr = [[0]*5 for x in range(6)]
và nó không tạo ra tài liệu tham khảo trùng lặp:
>>> arr[1][1] = 2
>>> arr
[[0, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
Bạn có thể sử dụng mảng N-chiều (ndarray). Đây là liên kết đến tài liệu. http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html
- 1. Python: khởi tạo danh sách đa chiều
- 2. Mảng đa chiều trong Python
- 3. giá trị Sum của mảng đa chiều bằng phím mà không cần vòng lặp
- 4. C++ đa chiều mảng khởi
- 5. tối ưu hóa vòng lặp mảng đa chiều php
- 6. Jinja2: Cách tạo mảng javascript đa chiều?
- 7. Có cách nào ngắn gọn hơn để khởi tạo các mảng đa chiều trống không?
- 8. Khởi tạo mảng trong Python
- 9. C/C++ Làm thế nào để sao chép một mảng char đa chiều mà không có vòng lặp lồng nhau?
- 10. PHP foreach lặp qua mảng đa chiều
- 11. PHP - Tạo mảng đa chiều thông qua một vòng lặp dựa trên một số
- 12. Khởi tạo std :: mảng với một dãy (cặp vòng lặp)
- 13. khởi tạo mảng C đa chiều có kích thước biến thành số không
- 14. đa chiều vector khởi tạo
- 15. Tạo Zeros đa chiều Python
- 16. Python: cắt một mảng đa chiều
- 17. python .count cho mảng đa chiều (danh sách danh sách)
- 18. Python: Tạo mảng liên kết trong vòng lặp
- 19. Khởi tạo một mảng đa chiều trong C# (với mảng khác)
- 20. Lặp lại mảng awk cho mảng đa chiều
- 21. Khởi tạo biến trong vòng lặp
- 22. Lập trình trò chơi mà không có vòng lặp chính
- 23. javascript tạo cú pháp mảng đa chiều
- 24. Thuật toán để tạo mảng đa chiều
- 25. php mảng đa chiều có giá trị
- 26. Arrays.fill với mảng đa chiều trong Java
- 27. Mảng đa chiều JavaScript
- 28. Postgres - mảng cho vòng lặp
- 29. Làm cách nào để khởi tạo các giá trị trong băm không có vòng lặp?
- 30. Vòng lặp for mà không có bất kỳ {}
Câu hỏi này hơi mơ hồ: bạn có muốn khởi tạo một mảng đa chiều trống không, hoặc bạn có muốn khởi tạo mảng đa chiều cho một tập hợp giá trị cụ thể không? –