2012-11-18 13 views
15

Mam zmienną liczbę list zdefiniowanych przez użytkownika, z których każda zawiera słowa. Na przykład, mogą istnieć trzy listy tak:Iterowanie przez nieznaną liczbę zagnieżdżonych pętli w pytonie

list1 = ["THE", "A"] 
list2 = ["ELEPHANT", "APPLE", "CAR"] 
list3 = ["WALKED", "DROVE", "SAT"] 

Co chcę jest iteracyjne nad każdą kombinację w każdej listy, sprawdzając każdy przeciwko słownika znanych słów, aby zobaczyć, które słowa-grupy są najbardziej podobne słownik. Oznacza to, że powtórzenia będą następujące:

[ 
    "THE ELEPHANT WALKED", 
    "THE APPLE WALKED", 
    "THE CAR WALKED", 
    "THE ELEPHANT DROVE", 
    "THE APPLE DROVE", 
    "THE CAR DROVE", 
    # ... 
    "A CAR SAT", 
] 

Problemem może być dowolna liczba list, a każda lista może zawierać zmienną liczbę pozycji. Wiem, że rekursję można by użyć do tego, ale potrzebuję rozwiązania bez rekursji. Problem Ciągle występuje jest fakt, że nie może być zmienną ilość list, w przeciwnym razie po prostu napisać:

for a in list1: 
    for b in list2: 
     for c in list3: 
      ... 

Ale ja nie wiem, gdzie się zatrzymać ...

Odpowiedz

24

itertools.product robi dokładnie co chcesz:

from itertools import product 

lists = [ 
    ['THE', 'A'], 
    ['ELEPHANT', 'APPLE', 'CAR'], 
    ['WALKED', 'DROVE', 'SAT'] 
] 

for items in product(*lists): 
    print items 
+2

Biorąc pod uwagę, że nie wie liczbę list '' pRODUK t (* listy) '' może być bardziej trafne. –

+1

@ Łupieżca: Robiłem to podczas komentowania – Eric

+0

Wielkie umysły myślą podobnie, +1. –

1

Używanie Pythona 3.2

from itertools import product 

[" ".join(i) for i in product(list1,list2,list3)]