2016-04-22 14 views
3

Ich habe eine sehr einfache Kombination Problem. Ich habe zwei Arrays (a und b). Array a gibt alle Werte an, die einer der drei Slots in Array b annehmen kann. Jeder Slot im Array b kann einen Wert zwischen 1 und 5 haben. Ein Beispiel dafür wäre [1, 4, 5]. Ich möchte ein Array (c) mit allen möglichen Kombinationen generieren. Ich erweitere gerne das Grundbeispiel größerer Arrays.[Python]: generieren und Array aller möglichen Kombinationen

Eingang:

a = [1, 2, 3, 4, 5] 
b = [1, 2, 3] 

Ausgang:

c = [[1, 1, 1], [1, 1, 2],[1, 1, 3], [1, 1, 4], [1, 1, 5], 
    [1, 2, 1], [1, 2, 2],[1, 2, 3], [1, 2, 4], [1, 2, 5], 
    [1, 3, 1], [1, 3, 2],[1, 3, 3], [1, 3, 4], [1, 3, 5], 
    [1, 4, 1], [1, 4, 2],[1, 4, 3], [1, 4, 4], [1, 4, 5], 
    [1, 5, 1], [1, 5, 2],[1, 5, 3], [1, 5, 4], [1, 5, 5], 
    [2, 1, 1], [2, 1, 2],[2, 1, 3], [2, 1, 4], [2, 1, 5], 
    [2, 2, 1], [2, 2, 2],[2, 2, 3], [2, 2, 4], [2, 2, 5], 
    [2, 3, 1], [2, 3, 2],[2, 3, 3], [2, 3, 4], [2, 3, 5], 
    [2, 4, 1], [2, 4, 2],[2, 4, 3], [2, 4, 4], [2, 4, 5], 
    [2, 5, 1], [2, 5, 2],[2, 5, 3], [2, 5, 4], [2, 5, 5], 
    [3, 1, 1], [3, 1, 2],[3, 1, 3], [3, 1, 4], [3, 1, 5], 
    [3, 2, 1], [3, 2, 2],[3, 2, 3], [3, 2, 4], [3, 2, 5], 
    [3, 3, 1], [3, 3, 2],[3, 3, 3], [3, 3, 4], [3, 3, 5], 
    [3, 4, 1], [3, 4, 2],[3, 4, 3], [3, 4, 4], [3, 4, 5], 
    [3, 5, 1], [3, 5, 2],[3, 5, 3], [3, 5, 4], [3, 5, 5], 
    [4, 1, 1], [4, 1, 2],[4, 1, 3], [4, 1, 4], [4, 1, 5], 
    [4, 2, 1], [4, 2, 2],[4, 2, 3], [4, 2, 4], [4, 2, 5], 
    [4, 3, 1], [4, 3, 2],[4, 3, 3], [4, 3, 4], [4, 3, 5], 
    [4, 4, 1], [4, 4, 2],[4, 4, 3], [4, 4, 4], [4, 4, 5], 
    [5, 5, 1], [5, 5, 2],[5, 5, 3], [5, 5, 4], [5, 5, 5], 
    [5, 1, 1], [5, 1, 2],[5, 1, 3], [5, 1, 4], [5, 1, 5], 
    [5, 2, 1], [5, 2, 2],[5, 2, 3], [5, 2, 4], [5, 2, 5], 
    [5, 3, 1], [5, 3, 2],[5, 3, 3], [5, 3, 4], [5, 3, 5], 
    [5, 4, 1], [5, 4, 2],[5, 4, 3], [5, 4, 4], [5, 4, 5], 
    [5, 5, 1], [5, 5, 2],[5, 5, 3], [5, 5, 4], [5, 5, 5]] 

Lösung für das Problem, das oben:

d = [] 
for i in range(len(a)): 
    for j in range(len(a)): 
     for k in range(len(a)): 
      e = [] 
      e.append(i+1) 
      e.append(j+1) 
      e.append(k+1) 
      d.append(e) 

ich eine generische Art und Weise suchen. Eine, die größere Arrays aufnehmen kann (siehe unten), ohne dass eine verschachtelte for-loop-Struktur verwendet werden muss. Ich suchte nach einem vergleichbaren Beispiel, konnte aber keinen im Stackoverflow finden.

Eingang:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 
+1

Werfen Sie einen Blick auf Python [itertools] (https://docs.python.org/2/library/itertools.html). Die Kombinationsmethode macht das, wonach Sie suchen. – Jggrnaut

+2

Von Ihrer Beschreibung, ich glaube auch nicht, dass Sie ein Array für 'b ', nur ein ganzzahliger Wert, der die Länge des Arrays – wilkesybear

+0

Ich hatte eine ähnliche Frage, wenn ich eine MonteCarlo-Simulation über eine Reihe von tolerierten Variablen, aber ich fand heraus, dass es keinen Sinn machte, ein Array aller möglichen Kombinationen zu generieren, wenn es so einfach war (siehe Ihren eigenen Code), diese Kombinationen im laufenden Betrieb zu generieren. – roadrunner66

Antwort

4

Sie suchen itertools.product().

a = [1, 2, 3, 4, 5] 
b = 3 # Actually, you just need the length of the array, values do not matter 

c = itertools.product(a, repeat=b) 

Beachten Sie, dass dies einen Iterator zurückgibt, können Sie es list() verwenden werfen müssen, aber das ewig dauern bewusst sein können und hoch Speicher verbrauchen, wenn die Größen wachsen.

1

Im allgemeinen Fall sollten Sie natürlich das Modul itertools verwenden, in diesem speziellen Fall itertools.product, wie in der anderen Antwort erklärt.

Wenn Sie die Funktion selbst implementieren möchten, können Sie die Rekursion verwenden, um sie auf alle Array-Größen anzuwenden. Außerdem sollten Sie es wahrscheinlich zu einer Generatorfunktion machen (unter Verwendung von yield anstelle von return), da das Ergebnis ziemlich lang sein könnte. Sie können so etwas wie dies versuchen:

def combinations(lst, num): 
    if num > 0: 
     for x in lst: 
      for comb in combinations(lst, num - 1): 
       yield [x] + comb 
    else: 
     yield [] 
Verwandte Themen