2009-10-05 22 views
7

Tôi đang tạo danh sách 2D và tôi muốn khởi tạo danh sách đó bằng cách hiểu danh sách. Tôi muốn nó để làm một cái gì đó như thế này:Python: Danh sách hiểu để gán các giá trị khác nhau

[[x for i in range(3) if j <= 1: x=1 else x=2] for j in range(3)] 

nên nó phải trả lại một cái gì đó như:

[[1,1,1], 
[1,1,1], 
[2,2,2]] 

Làm thế nào tôi có thể đi về việc này?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

14

Có vẻ như bạn đang tìm kiếm một cái gì đó như thế này:

[[1 if j <= 1 else 2 for i in range(3)] for j in range(3)] 

Các Python conditional expression là một chút khác biệt so với những gì bạn có thể được sử dụng để nếu bạn đang đến từ một cái gì đó như C hoặc Java:

Khái niệm x if C else y đánh giá lại đầu tiên C (không x); nếu C là đúng, x được đánh giá và giá trị của nó được trả về; nếu không, y được đánh giá và giá trị của nó được trả về.

Một cách hơi ngắn hơn để làm điều tương tự là:

[[1 if j <= 1 else 2]*3 for j in range(3)] 
+0

này là tốt vì tôi có thể dễ dàng mở rộng bằng cách thay đổi kích thước của dãy núi này và thay đổi tuyên bố có điều kiện. Cảm ơn! – Nope

14

phản ứng của Greg là đúng, mặc dù một biểu thức đơn giản hơn nhiều và nhanh hơn để tạo ra kết quả mong muốn của bạn sẽ

[[j] * 3 for j in (1, 1, 2)] 

tức là, hãy nhớ rằng for không cần phải áp dụng cho một chỉ range ;-), danh sách nhân, tồn tại, và như vậy ;-).

+0

Tôi thích câu trả lời này, gọn gàng – Juparave

+0

Điều này có cho phép bảng vẫn có thể thay đổi được không? nói rằng tôi muốn thay đổi [0] [0] thành 10, điều đó có thay đổi bất kỳ giá trị nào khác không? – Nope

+0

@Casey - Không, nó sẽ không thay đổi bất kỳ giá trị nào khác. –

1

Hãy thử điều đó

>>> [[(1 if j<1 else 2) for i in range(3)] for j in range(3)] 
[[1, 1, 1], [2, 2, 2], [2, 2, 2]] 

Lần thứ hai j = 1 nên j < 1 thất bại

Các vấn đề liên quan