2016-06-03 9 views
2

Ich habe eine verschachtelte Liste in Python als:Vereinfachen verschachtelte Listen als cartesianischen Produkt

lst = ['alpha', ['beta', 'gamma'], ['delta', 'peta', 'lambda']] 

ich eine Funktion benötigen, die eine Liste mit dem cartesianischen Produkt von ihnen zurück. Nun, ich denke cartesianischen Produkt ist kein richtige Wort, aber immer noch in einer logischen Art und Weise wird das Ergebnis wie folgt aussehen:

final_lst = your_magical_function(lst) 
print final_lst 

''' 
[['alpha','beta','delta'], 
['alpha','beta','peta'], 
['alpha','beta','lambda'], 
['alpha','gamma','delta'], 
['alpha','gamma','peta'] 
['alpha','gamma','lambda']] 
''' 

Eine Funktion, mit Rekursion oder ohne, beide sind willkommen.

+1

Warum muss Rekursion verwendet werden? – DeepSpace

+0

Es ist okay, ich brauche keine rekursive Funktion. –

Antwort

1

Verwenden itertools.product, die Sie benötigen, um leicht Ihre Eingabe ('alpha' zu ['alpha']) zu ändern:

from itertools import product 

lst = [['alpha'],['beta','gamma'],['delta','peta','lambda']] 

for res in product(*lst): 
    print(res) 

>> ('alpha', 'beta', 'delta') 

('alpha', 'beta', 'peta') 
('alpha', 'beta', 'lambda') 
('alpha', 'gamma', 'delta') 
('alpha', 'gamma', 'peta') 
('alpha', 'gamma', 'lambda') 
1

Sie itertools.product verwenden können, wenn Sie alle Elemente in Listen umgewandelt haben:

>>> from itertools import product 
>>> lst = ['alpha',['beta','gamma'],['delta','peta','lambda']] 
>>> list(product(*(x if isinstance(x, list) else [x] for x in lst))) 
[('alpha', 'beta', 'delta'), ('alpha', 'beta', 'peta'), ('alpha', 'beta', 'lambda'), ('alpha', 'gamma', 'delta'), ('alpha', 'gamma', 'peta'), ('alpha', 'gamma', 'lambda')] 
1

Es ist großartig, Bibliotheken in Python zu verwenden! Wenn Sie jedoch auf der Suche nach einer reinen Python-Implementierung:

def CartesianProduct(list_entry): 
# Save Sizes of Everything 
size_dictionary = {} 

# Get Size of Entire Entry List 
size_dictionary["full_size"] = len(list_entry) 

# Get Sizes of All Sub Entries 
for i in range(len(list_entry)): 
    if not (isinstance(list_entry[i],list)): 
     list_entry[i] = [list_entry[i]] 
    size_dictionary[i] = len(list_entry[i]) 

# Now lets create the cartesian product 
# Lets Create a Dictionary to hold all of the results 
cartesian_result = {} 

# Lets get the size of the final result 
final_result_amount = 1 
for i in range(size_dictionary["full_size"]): 
    final_result_amount = final_result_amount * size_dictionary[i] 

# And create the final results 
for i in range(final_result_amount): 
    cartesian_result[i] = [] 

    for j in range(size_dictionary["full_size"]): 
     cartesian_result[i].append(list_entry[j][i % size_dictionary[j]]) 

    print(cartesian_result[i]) 

def main(): 
    lst = ['alpha',['beta','gamma'],['delta','peta','lambda']] 
    CartesianProduct(lst) 

main() 

Es ist nicht annähernd so hübsch und einfach wie itertools verwenden, aber dennoch ist es Spaß, die Logik zu implementieren, die die Bibliotheken einmal in einer Weile verwenden.

Verwandte Themen