2016-07-25 16 views
-1

Ich habe zwei Listengeneriert alle Kombinationen von zwei Listen und gibt sie eines nach der anderen in Python

[1, 3, 4] [7, 8] 

Ich möchte alle Kombinationen von zwei Listen aus den kleinsten Kombinationen Ausgang wie 17,18,37,38,47,48,137,138,147,148......178,378.... für jeden Jetzt erzeugen Kombination muss ich es an einem anderen Ort testen und wenn ich diese Kombination gefunden habe, werde ich die Kombinationsgeneration stoppen. Zum Beispiel Wenn ich sehe, dass vorhanden ist, dann werde ich die anderen Kombinationen nicht erzeugen. Wenn ich 48 gefunden habe, werde ich die späteren Kombinationen nicht generieren.

+0

Wir machen Ihre Hausaufgaben nicht für Sie. –

+0

Wenn Sie Hilfe bei einem Hausaufgabenproblem benötigen (was ich vermute, was das ist), stellen Sie sicher, dass Sie das, was Sie bisher getan haben, einbeziehen und um Rat fragen, nicht um Lösungen. Ich würde empfehlen, dies zu lesen: http://meta.stackexchange.com/questions/10811/how-do-iask-and-answer-homework-questions oder das: http://meta.stackoverflow.com/questions/ 253792/stack-overflow-and-homework-questions – Checkmate

+0

es ist keine Hausaufgabe. Es ist Teil eines Projekts, das ich mache. Ich muss alle Kombinationen aus den beiden Listen nacheinander erstellen. Ich habe nur gefragt, ob es einen effizienten Weg gibt, es zu tun, da der, den ich mache, nicht effizient ist ... – tanay

Antwort

3

Dies ist ein ziemlich hässlicher Algorithmus, aber es hat für mich funktioniert. Es ist auch nicht super teuer (erwarten, natürlich, für die Erzeugung aller Kombinationen mit itertools.combinations (a, i) ...):

import itertools 

def all_combs(a): 
    to_return = [] 
    temp = [] 
    for i in a: 
     temp.append(i) 
    to_return.append(temp) 
    for i in range(2, len(a) + 1): 
     temp = [] 
     for j in itertools.combinations(a, i): 
      s = "" 
      for k in j: 
       s = s + str(k) 
      temp.append(int(s)) #Get all values from the list permutation 
     to_return.append(temp) 
    print(to_return) 
    return to_return 

def all_perm(a, b): 
    a_combs = all_combs(a) 
    b_combs = all_combs(b) 
    to_return = [] 
    for i in a_combs: 
     for j in b_combs: 
      for k in i: 
       for l in j: 
        to_return.append(10**len(str(l)) * k + l) 
    to_return.sort() 
    for i in to_return: 
     yield i 

EDIT: Ein Fehler wurde behoben, wo Werte mehrstellige waren nicht richtig gelesen EDIT in: die Funktion wirken als Generator bearbeitet: ein Fehler wurde behoben Beteiligung Ziffern (durch eine Art Zugabe ...)

EDIT: Hier ist ein weit überlegen Implementierung ist, die eng um den Generator Stil viel mehr erfüllt. Es ist immer noch nicht perfekt, aber es sollte eine gute Beschleunigung im durchschnittlichen Fall bieten:

import itertools 

def add_to_dict(dict, length, num): 
    if not length in dict: 
     dict[length] = [] 
    dict[length].append(num) 

def sum_to_val(val): 
    to_return = [] 
    for i in range(1, val): 
     to_return.append([i, val-i]) 
    return to_return 

def all_combs(a): 
    to_return = {} 
    for i in a: 
     add_to_dict(to_return, len(str(i)), i) 
    for i in range(2, len(a) + 1): 
     for j in itertools.combinations(a, i): 
      s = "" 
      for k in j: 
       s = s + str(k) 
      add_to_dict(to_return, len(s), int(s)) #Get all values from the list permutation 
    return to_return 

def all_perm(a, b): 
    a_combs = all_combs(a) 
    b_combs = all_combs(b) 
    for val in range(max(a_combs.keys())+max(b_combs.keys())+1): 
     to_return = [] 
     sums = sum_to_val(val) 
     for i in sums: 
      if not(i[0] in a_combs and i[1] in b_combs): 
       continue 
      for j in a_combs[i[0]]: 
       for k in b_combs[i[1]]: 
        to_return.append(10**len(str(k)) * j + k) 
     to_return.sort() 
     for i in to_return: 
      yield i 
+0

@tanay Möglicherweise haben Sie dies bereits gefunden, aber dieser Code hat einen Fehler. Ich habe eine sort() hinzugefügt, um es zu beheben, aber das könnte für große Listen langsam sein. Ich werde eine bessere Lösung finden. – Checkmate

+0

Hmm, nach dem Testen ist die Zeit, die benötigt wird, um alle Werte in to_return zu setzen und zu sortieren, ziemlich inakzeptabel. Lassen Sie es mich wissen, wenn es ein Problem für Sie ist, und ich kann den Algorithmus neu schreiben, um dies zu vermeiden. – Checkmate

+0

Sorry für die späte Antwort .. Ich habe tatsächlich ein bisschen vom Algorithmus geändert.Ich wollte vorher nicht alle Kombinationen der beiden Listen vorproduzieren. Wenn ich eine Übereinstimmung der Kombination erhalte, höre ich auf zu loopen. Ich produziere also nur für eine Liste und gehe dann die andere Liste durch und erzeuge die Kombination nach Bedarf. Und wenn ich eine Matchkombination bekomme, höre ich dort auf. – tanay