2016-01-18 34 views
12

Tôi đang cố gắng in tất cả các liệt kê có thể có của một danh sách cho ba biến. Ví dụ, nếu đầu vào của tôi là:Liệt kê ba biến trong việc hiểu danh sách python

x = 1 
y = 1 
z = 1 

Tôi muốn đầu ra được như:

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1]] 

Nếu bất kỳ x, y, biến z là cao hơn 1, nó sẽ liệt kê tất cả các số nguyên từ 0 đến giá trị biến. Ví dụ: nếu x = 3 thì 0, 1, 2 hoặc 3 sẽ có thể ở vị trí đầu tiên trong danh sách 3 phần tử.

Ngay bây giờ tôi đang tạo ra danh sách hiểu như thế này:

output = [ [x,y,z] for x,y,z in range(x,y,z)] 

Tôi nghĩ rằng cái gì là sai với chức năng nhiều?

+0

Bạn có muốn đầu ra trong chính xác thứ tự đó? Và nếu vậy, làm thế nào để có được thứ tự đầu vào phức tạp hơn? –

+0

Tôi không quan tâm đến trật tự, nhưng muốn nó có thể mở rộng thành các giá trị biến không nhị phân, vì vậy nếu như x = 2, sẽ có các danh sách như [2,0,0] [2,0,1 ], [2,1,0], [2,1,1] ở đầu ra là tốt. –

Trả lời

8

bổ sung các giải pháp sử dụng product, bạn cũng có thể sử dụng danh sách hiểu ba.

>>> x, y, z = 1, 2, 3 
>>> [(a, b, c) for a in range(x+1) for b in range(y+1) for c in range(z+1)] 
[(0, 0, 0), 
(0, 0, 1), 
(0, 0, 2), 
(some more), 
(1, 2, 2), 
(1, 2, 3)] 

+1 là cần thiết vì range không bao gồm giới hạn trên. Nếu bạn muốn đầu ra là danh sách các danh sách, bạn chỉ có thể thực hiện [[a, b, c] for ...].

Lưu ý, tuy nhiên, điều này làm việc sẽ rõ ràng duy nhất là bạn luôn có ba biến (x, y, z), trong khi product sẽ làm việc với một số tùy ý các danh sách/giới hạn trên.

14

Bạn có thể sử dụng product() chức năng từ itertools như sau:

from itertools import product 

answer = list(list(x) for x in product([0, 1], repeat=3)) 
print(answer) 

Output

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]] 
+0

Trên thực tế, cũng giống như các biến có thể không phải là nhị phân, vì vậy nếu x = 2, y = 1, z = 1, có thể có các danh sách như [2,1,1] ở đầu ra ... là có một cách để làm giải pháp của bạn bằng cách sử dụng các biến x, y và z thay vì mã hóa cứng 1 và 0 ở đó? –

+0

Vui lòng trợ giúp, nhưng có lẽ tốt nhất nếu bạn đặt câu hỏi trong một câu hỏi riêng biệt, vì nó có thể yêu cầu một cách tiếp cận hơi khác! – gtlambert

+0

Tại sao lại chuyển đổi?Chỉ cần làm tương tự trước khi chuyển đổi trình tạo sản phẩm 'thành một danh sách, ví dụ: '[danh sách (x) cho x trong sản phẩm (...)]' hoặc 'danh sách (bản đồ (danh sách, sản phẩm (...))' –

6

Bạn có thể sử dụng range() chức năng trong một sự hiểu biết danh sách và itertools.product chức năng:

>>> x = 1 
>>> y = 1 
>>> z = 1 
>>> from itertools import product 
>>> list(product(*[range(i+1) for i in [x,y,z]])) 
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)] 

Cách tiếp cận này sẽ làm việc cho các số khác nhau quá:

>>> x = 2 
>>> y = 2 
>>> z = 2 
>>> 
>>> list(product(*[range(i+1) for i in [x,y,z]])) 
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)] 
>>> 
+0

Có cách nào để có được đầu ra không –

+0

@WilliamRoss Bạn có thể sử dụng một danh sách hiểu thay vì 'danh sách' chức năng.' [danh sách (mục) cho mục trong sản phẩm (* [phạm vi (i + 1) cho tôi trong [x , y, z]])] ' – Kasramvd

3

Nếu bạn cần nó trong hình thức của một danh sách liệt kê (thay vì danh sách các hàng), bạn có thể sử dụng map so với sản lượng của câu trả lời bằng cách Kasramvd, đó là:

map(list,list(product(*[range(i+1) for i in [x,y,z]]))) 
+4

1) trong Python 3,' map' tạo ra một trình tạo, không phải danh sách và 2) không cần phải bật trình tạo trả về bởi 'product' vào danh sách trước khi chuyển nó tới' map '. Vì vậy, điều này đúng hơn là 'danh sách (bản đồ (danh sách, sản phẩm (...))' –

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