matrix

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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
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.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Momentan i und j beinhalten A, B und C. Woher weis ich dass i und j unterhalb der diagonalen liegt?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
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.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten