2011-10-27 38 views
5

Tôi thực sự không thể tìm thấy điều này. Tôi đã cố gắng sử dụng itertools, đã thử tất cả các loại looping, nhưng tôi vẫn không thể đạt được những gì tôi muốn. Dưới đây là những gì tôi cần:Python: tất cả các kết hợp có thể có của danh sách "động"

Tôi có danh sách như:

list = [("car", 2), ("plane", 3), ("bike", 1)] 

Danh sách này là mỗi lần khác nhau, có thể có 5 mặt hàng khác nhau trong mỗi lần và những gì tôi cần là để có được một cái gì đó như thế này :

car1, plane1, bike1 
car1, plane2, bike1 
car1, plane3, bike1 
car2, plane1, bike1 
car2, plane2, bike1 
car2, plane3, bike1 

Tôi thực sự bị mất. Rõ ràng nó sẽ có thể là một cái gì đó rất đơn giản, nhưng tôi không thể giải quyết nó.

Trả lời

7

Bạn có thể sử dụng itertools.product():

my_list = [("car", 2), ("plane", 3), ("bike", 1)] 
a = itertools.product(*([name + str(i + 1) for i in range(length)] 
         for name, length in my_list)) 
for x in a: 
    print x 

in

('car1', 'plane1', 'bike1') 
('car1', 'plane2', 'bike1') 
('car1', 'plane3', 'bike1') 
('car2', 'plane1', 'bike1') 
('car2', 'plane2', 'bike1') 
('car2', 'plane3', 'bike1') 
+0

@SvenMarnach: Cảm ơn! Điều này thật đúng với gì mà tôi đã tìm kiếm! – Meph

-1

Để thực hiện điều gì đó tương tự, mức độ phức tạp của chương trình sẽ rất cao. thử làm lại ra logic để bạn có thể giảm bớt sự phức tạp ..

+0

Ok, còn trường hợp không có từ thì sao? Chỉ để tạo ra tất cả các kết hợp của các số phạm vi cụ thể? Điều này thực sự là khó? Tôi chỉ yêu cầu, nhưng tôi điều đó không phải là khó khăn. – Meph

+0

@Anuj Hãy nhìn vào các câu trả lời khác. Điều này thực sự là _very simple_, không phức tạp. – agf

1

Bạn có thể thực hiện nó với một hàm đệ quy:

def combis(ls): 
    if not ls: 
     yield [] 
     return 
    (name, limit) = ls[-1] 
    for start in combis(ls[:-1]): 
     for c in range(1, limit+1): 
     yield start + [(name, c)] 
+0

Không phải là rất Pythonic. – agf

2

Hãy thử cách này:

L = [("car", 2), ("plane", 3), ("bike", 1)] 
O = [] 
N = [] 
for each in L: 
    O.append(each[0]) 
    N.append(each[1]) 
for each in O: 
    strin = "" 
    for item in N: 
    strin = strin + item + each + "," 

    print strin[:-1] 

Vì danh sách của bạn sẽ chỉ chứa tối đa năm mục, đây là giải pháp hợp lý.

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