Seite 1 von 1

matrix

Verfasst: Montag 21. Mai 2012, 05:40
von mit
Hallo,
Wie ist es möglich z.b. nur A:B auszugeben und nicht B:A?

Code: Alles auswählen

>>> data = ['','','']
>>> data = ['A','B','C']
>>> for i in data:
...     for j in data:
...             if i != j: print(i + ':' + j)
... 
A:B
A:C
B:A
B:C
C:A
C:B
>>> 
Vielen Dank im Voraus.

Re: matrix

Verfasst: Montag 21. Mai 2012, 05:48
von Hyperion
Du suchst (vermutlich) `itertools.combinations`:

Code: Alles auswählen

In [1]: from itertools import combinations

In [2]: print(*combinations(('A', 'B', 'C'), 2))
('A', 'B') ('A', 'C') ('B', 'C')
Btw: Diese Zeile

Code: Alles auswählen

>>> data = ['','','']
ist überflüssig - ich hoffe, das ist Dir klar ;-)

Re: matrix

Verfasst: Montag 21. Mai 2012, 06:29
von mit
Danke es funktioniert prima, aber wie koennte ich diese Darstellung bekommen:

Code: Alles auswählen

 , A, B  , C
A, 0, A:B, A:C
B,  , 0  , B:C
C,  ,    , 0

Re: matrix

Verfasst: Montag 21. Mai 2012, 07:49
von deets
Das ist ja ne komplett andere Aufgabenstellung. Und die Loesung dafuer ist ganz einfach: wenn i und j ein Indexpaar darstellen, welches *unterhalb* der diagonalen liegt, dann darfst du nix (oder 0 oder was) ausgeben. Aber wann diese Bedingung so zutrifft, das solltest du schon selbst rauskriegen.

Re: matrix

Verfasst: Montag 21. Mai 2012, 15:13
von mit
Momentan i und j beinhalten A, B und C. Woher weis ich dass i und j unterhalb der diagonalen liegt?

Re: matrix

Verfasst: Montag 21. Mai 2012, 15:27
von EyDu
mit hat geschrieben:Momentan i und j beinhalten A, B und C. Woher weis ich dass i und j unterhalb der diagonalen liegt?
Indem du zu i und j noch die Indizes nimmst und prüfst ob der Index der Spalte größer ist als der der Zeile.

Re: matrix

Verfasst: Montag 21. Mai 2012, 15:29
von BlackJack
@mit: Dann musst Du halt noch die Koordinaten mit in die Schleifen bringen. Siehe die `enumerate()`-Funktion. Und `i` und `j` sollte man vielleicht *dafür* verwenden und nicht für die Buchstaben. Denn das sind die typischen Laufvariablen für ganze Zahlen. Wenn man `i`, `j`, oder `k` in einer Schleife sieht, ist es etwas verwirrend wenn das keine Zahlen sind.

Re: matrix

Verfasst: Dienstag 22. Mai 2012, 04:40
von mit
Danke, hier ist meine Loesung:

Code: Alles auswählen

  1 data = ['A','B','C']
  2 data_no = len(data)
  3 print(', ' + ', '.join(data))
  4 for i in range(data_no):
  5     print(data[i] + ','),
  6     for j in range(data_no):
  7         if (i < j): print(data[i]+data[j] + ', '),
  8         if (i > j) : print(', '),
  9         if (i == j): print(str(0) + ', '),
 10     print
Vielleicht ist es moeglich dies zu verbessern.

Re: matrix

Verfasst: Dienstag 22. Mai 2012, 05:26
von Hyperion
mit hat geschrieben: Vielleicht ist es moeglich dies zu verbessern.
Ja, z.B. könntest Du die Zeilennummern entfernen :-P So kann das ja niemand ohne Vorarbeit testen...

Wieso hast Du nicht auf BlackJacks Rat gehört? `enumerate` ist Dein Freund, wenn es darum geht, einen Index zu generieren *und* auf das zugehörige Element zuzugreifen.

Wenn ich `i == j` und `i < j` und `i > j` teste, dann sind das *alle* möglichen Bedingungen. Da jeweils nur eine wahr sein kann, solltest Du hier mit `if... elif... else` arbeiten.

Ich würde ggf. auch die Ausgabe von der Generierung trennen; damit kann man diese leichter im nach hinein ändern.

Ich komme damit auf diese Lösung:

Code: Alles auswählen

def generate_matrix(data):
    yield [""] + data
    for y, chary in enumerate(data):
        line = [chary]
        for x, charx in enumerate(data):
            if y < x:
                line.append("%s%s" % (chary, charx))
            elif x == y:
                line.append("0")
            else:
                line.append("")
        yield line


data = ['A','B','C']
matrix = generate_matrix(data)
for line in matrix:
    print ", ".join("%2s" % item for item in line)