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

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)