2012-09-02 26 views
5

Tôi muốn lặp trong vòng lặp for sử dụng 3 (hoặc bất kỳ số lượng) liệt kê với bất kỳ số lượng các yếu tố, ví dụ:Làm thế nào để lặp trong một sản phẩm Descartes danh sách

from itertools import izip 
for x in izip(["AAA", "BBB", "CCC"], ["M", "Q", "S", "K", "B"], ["00:00", "01:00", "02:00", "03:00"]): 
    print x 

nhưng nó mang lại cho tôi :

('AAA', 'M', '00:00') 
('BBB', 'Q', '01:00') 
('CCC', 'S', '02:00') 

tôi muốn:

('AAA', 'M', '00:00') 
('AAA', 'M', '01:00') 
('AAA', 'M', '02:00') 
. 
. 

('CCC', 'B', '03:00') 

Thật sự tôi muốn điều này:

for word, letter, hours in [cartesian product of 3 lists above] 
    if myfunction(word,letter,hours): 
     var_word_letter_hours += 1 

Trả lời

12

Bạn muốn sử dụng product của danh sách:

from itertools import product 

for word, letter, hours in product(["AAA", "BBB", "CCC"], ["M", "Q", "S", "K", "B"], ["00:00", "01:00", "02:00", "03:00"]): 

Demo:

>>> from itertools import product 
>>> for word, letter, hours in product(["AAA", "BBB", "CCC"], ["M", "Q", "S", "K", "B"], ["00:00", "01:00", "02:00", "03:00"]): 
...  print word, letter, hours 
... 
AAA M 00:00 
AAA M 01:00 
AAA M 02:00 
AAA M 03:00 
... 
CCC B 00:00 
CCC B 01:00 
CCC B 02:00 
CCC B 03:00 
+0

Cảm ơn bạn, vui lòng xem câu hỏi được cập nhật của tôi ở trên một lần nữa, – alwbtc

4

Sử dụng itertools.product:

import itertools 

for x in itertools.product(["AAA", "BBB", "CCC"], 
          ["M", "Q", "S", "K", "B"], 
          ["00:00", "01:00", "02:00", "03:00"]): 
    print x 

đầu ra:

('AAA', 'M', '00:00') 
('AAA', 'M', '01:00') 
... 
('CCC', 'B', '02:00') 
('CCC', 'B', '03:00') 
0

Chỉ cần cho các hồ sơ, giải pháp khác chỉ là lồng for vòng:

for a in ["AAA", "BBB", "CCC"]: 
    for b in ["M", "Q", "S", "K", "B"]: 
     for c in ["00:00", "01:00", "02:00", "03:00"]: 
      x = (a, b, c) 
      # Use x ... 

Theo tôi, đây là rõ ràng hơn rất nhiều so với việc phải tìm hiểu/nhớ những gì itertools.product chức năng thực hiện. Lý do duy nhất để sử dụng đó là nếu bạn đang ở trong một tình huống trừu tượng hơn; ví dụ. bạn cần chuyển một trình lặp tới một hàm thay vì lặp lại nó ngay lập tức, hoặc nếu bạn có một danh sách tùy ý các danh sách mà bạn muốn lấy sản phẩm Descartes (trong trường hợp này bạn có thể sử dụng product(*lists)).

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