Seite 1 von 1

Kombinatorisches Problem... leider keine Permutation...

Verfasst: Dienstag 30. Oktober 2007, 18:23
von acidk
Hallo Leute!

Ich habe eine Liste (das Original hat 133 Einträge). Die drei Werte eines jeden Objektes stehen für eine x/y und z Koordinate = ein Punkt

Nun möchte ich alle Möglichen 3 Punkt Kombinationen bilden, ohne dass eine Kombination doppelt vorkommt, also x/y/z nicht einfach in einem array vertauscht(x/z/y) sind.

mein Ansatz:

Code: Alles auswählen

x = 0

a = ([1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21])
laenge = len(a)

y = x+1
z = x+2
for i in (a):
    while (x !=len(a)):
              
        b = a[x],a[y],a[z] 
        
        print b
        x=x+1

Ich bekomme als output:

Code: Alles auswählen

[1, 2, 3], [4, 5, 6], [7, 8, 9])
([4, 5, 6], [4, 5, 6], [7, 8, 9]) #2
([7, 8, 9], [4, 5, 6], [7, 8, 9])
([10, 11, 12], [4, 5, 6], [7, 8, 9])
([13, 14, 15], [4, 5, 6], [7, 8, 9])
([16, 17, 18], [4, 5, 6], [7, 8, 9])
([19, 20, 21], [4, 5, 6], [7, 8, 9])
>>>
Wobei Zeile 2 auch schon wieder doppelt wäre...
:(
was hebe ich falsch gemacht?

Besten Dank!

Verfasst: Dienstag 30. Oktober 2007, 18:41
von schlangenbeschwörer
Hi!
Meinst du sowas?

Code: Alles auswählen

def f(menge):
	l=list(menge)
	l2 = []
	while l:
		 item = l.pop(0)
		 for x in l:
			 for y in l:
				 if x != y:
					 l2.append((item, x, y))
	return l2
(ich hoffe das stimmt jetzt)

Verfasst: Dienstag 30. Oktober 2007, 19:20
von acidk
Genau das ists!
Vielen Dank für die schnelle Hilfe!

Verstehe allerdings nicht ganz, warum kein Eintrag doppelt ist (???) und was

item = l.pop(0)

bewirkt!

Vielen Dank!

Verfasst: Dienstag 30. Oktober 2007, 19:37
von Leonidas
acidk hat geschrieben: item = l.pop(0)
Das entfernt das erste (0) Item aus `l` und gibt es zurück, dabei wird es an `item` gebungen und ist nun nicht mehr Teil von `l`.

Verfasst: Mittwoch 31. Oktober 2007, 09:18
von acidk
Gäb es eine Möglichlkeit, wie ich mit meinem Ansatz ans Ziel käme? :?

Verfasst: Mittwoch 31. Oktober 2007, 09:45
von Leonidas
acidk hat geschrieben:Gäb es eine Möglichlkeit, wie ich mit meinem Ansatz ans Ziel käme? :?
Ich finde deinen Ansatz recht kompliziert.

Ich denke ich habe eine einfachere Lösung als schlangenbeschwörer hinbekommen:

Code: Alles auswählen

a = ([1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21])
plain = sum(a, [])
points = list()

for first in plain:
    for second in plain:
        for third in plain:
            point = set((first, second, third))
            if len(point) == 3:
                points.append(point)
                
print points
Ich iteriere einfach durch jedes Element der Liste (die ich vorher platt gemacht habe), füge die Indizes in ein Set ein und schaue damit ob es drei unterschiedliche Werte sind (Reihenfolge ist, wie du gemeint hast, egal). Wenn ja, ist das ein gesuchter Punkt, wenn nein, dann eben nicht.

Verfasst: Mittwoch 31. Oktober 2007, 09:52
von acidk
8) Cool! Vielen Dank!

Verfasst: Mittwoch 31. Oktober 2007, 14:42
von HWK
@Leonidas: Soweit ich acidk verstanden habe, möchte er nicht die Kombinationen sämtlicher x-, y- und z-Werte erhalten, was Dein Code ja liefert, sondern die Kombinationen aller vorgegebenen Punkte, die jeweils aus x, y und z bestehen. Das Plattmachen der Liste wäre dann nicht sinnvoll. Sollte Deine Variante dann nicht eher so aussehen?

Code: Alles auswählen

plain = ((1,2,3),(4,5,6),(7,8,9),(10,11,12),(13,14,15),(16,17,18),(19,20,21))
points = list()

for first in plain:
    for second in plain:
        for third in plain:
            point = set((first, second, third))
            if len(point) == 3:
                points.append(point)
                
print points
Und das wäre eine unpythonischere, aber wohl effektivere Methode, da man nichts vergleichen oder in Sets umwandeln muss:

Code: Alles auswählen

points = ((1,2,3),(4,5,6),(7,8,9),(10,11,12),(13,14,15),(16,17,18),(19,20,21))
result = list()
lenght = len(points)

for i in range(lenght):
    for j in range(i + 1, lenght):
        for k in range(j + 1, lenght):
            result.append((points[i], points[j], points[k]))
                
print result
MfG
HWK