2012-09-02 18 views
5

Ich möchte in einer for-Schleife 3 (oder eine beliebige Anzahl von) führt mit einer beliebigen Anzahl von Elementen, beispielsweise mit iterieren:Wie in einem kartesisches Produkt von Listen iterieren

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 

aber es gibt mir :

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

ich möchte:

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

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

Eigentlich ist das ich will:

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

Antwort

12

Sie wollen die product der Listen verwenden:

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

Danke, bitte sehen Sie meine aktualisierte Frage oben wieder, – alwbtc

4

Verwendung 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 

Ausgabe:

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

Nur für das Protokoll, ist eine andere Lösung nur for Schleifen verschachtelt:

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 ... 

Meiner Meinung nach, ist dies viel deutlicher als mit/um herauszufinden, daran erinnern, was die itertools.product Funktion tut. Der einzige gute Grund, das zu verwenden, ist, wenn Sie in einer abstrakteren Situation sind; z.B. Sie müssen einen Iterator an eine Funktion übergeben, anstatt sofort darüber zu iterieren, oder wenn Sie eine willkürliche Liste von Listen haben, denen Sie das kartesische Produkt von (in diesem Fall können Sie product(*lists) verwenden).

Verwandte Themen