Kombinatorisches Problem... leider keine Permutation...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

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!
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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)
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

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!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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`.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

Gäb es eine Möglichlkeit, wie ich mit meinem Ansatz ans Ziel käme? :?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
acidk
User
Beiträge: 75
Registriert: Samstag 6. Januar 2007, 18:54
Wohnort: Braunschweig

8) Cool! Vielen Dank!
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@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
Antworten