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

Kombinatorisches Problem... leider keine Permutation...

Beitragvon acidk » Dienstag 30. Oktober 2007, 18:23

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=][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])[/code]
>>>
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:

Beitragvon schlangenbeschwörer » Dienstag 30. Oktober 2007, 18:41

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

Beitragvon acidk » Dienstag 30. Oktober 2007, 19:20

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!
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 30. Oktober 2007, 19:37

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

Beitragvon acidk » Mittwoch 31. Oktober 2007, 09:18

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

Beitragvon Leonidas » Mittwoch 31. Oktober 2007, 09:45

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

Beitragvon acidk » Mittwoch 31. Oktober 2007, 09:52

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

Beitragvon HWK » Mittwoch 31. Oktober 2007, 14:42

@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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder