Seite 1 von 1
Teilmengenbedingung in for-Schleifen?
Verfasst: Donnerstag 5. Februar 2009, 16:20
von Tyrax
Hallo,
ist es möglich eine Teilmengenabfrage in eine einzelne for-Schleife zu schreiben? Ich meine das etwa so(PseudoCode):
Code: Alles auswählen
Menge = {"irgendwelche Elemente"}
for {i, j}<Menge
"Mach was tolles"
print("was tolles")
Ich hab's einfach mal probiert, bekam aber Syntax-Fehler. Im Forum habe ich dazu nix gefunden. Falls es nicht geht, kann ich natürlich mehrere for-Schleifen verschachteln.
Grüße, Tyrax
Verfasst: Donnerstag 5. Februar 2009, 16:28
von derdon
Ich habe nicht ganz verstanden, was du vorhast, Mengen werden in Python mit der BIF set bzw frozenset erstellt. Vor der for-Schleife gehört eine If-Abfrage, das kann man nicht so kurz schreiben, wie du es möchtest. Suchst du evtl. die BIF zip?
Verfasst: Donnerstag 5. Februar 2009, 16:32
von numerix
So wie du dir das vorstellst, geht es IMHO nicht. Ich verstehe aber auch den Sinn nicht: Was willst du denn damit erreichen? Kannst du es mal konkreter machen als das Beispiel es hergibt?
Verfasst: Donnerstag 5. Februar 2009, 16:34
von numerix
derdon hat geschrieben:Ich habe nicht ganz verstanden, was du vorhast, Mengen werden in Python mit der BIF set bzw frozenset erstellt.
Ab Python 3.0 geht es auch so:
Verfasst: Donnerstag 5. Februar 2009, 16:39
von DasIch
Code: Alles auswählen
In [1]: a = set(('foo', 'bar', 'baz'))
In [2]: b = set(('foo', 'bar'))
In [3]: b.issubset(a)
Out[3]: True
Verfasst: Donnerstag 5. Februar 2009, 17:26
von Tyrax
Hallo,
ich erkläre meine Absicht mal an einem Beispiel: Ich will einen Graphen, d.h. ein Paar (V, E) erzeugen, wobei V eine Menge und E eine Menge von (meist) 2-elementigen Teilmengen von V ist. In der Anschauung also Ecken (
Vertex) und Kanten (
Edge).
Nun soll der Benutzer erst die Anzahl der Ecken eingeben, das Skript erzeugt
V = {1, 2, 3, .., n}.
Dann soll für jede der möglichen Kanten {i, j}\subseteq V eine Abfrage kommen "Soll diese Kante in den Graphen". Hier soll die for-Schleife die möglichen Kanten durchlaufen.
Soweit der Plan. Mein Ziel ist es eher Python zu lernen, als mit dem Skript zu arbeiten. Es gibt sicher auch andere (bessere?) Möglichkeiten, Graphen einzugeben (Adjazenzmatrix, Nachbarschaftslisten u.ä.). Ich freue mich über weitere Tipps und Anregungen,
Grüße, Tyrax
Edit: Hier meine Lösung mit mehreren Schleifen:
Code: Alles auswählen
# Zunächst zu 1.: Der Benutzer soll die Anzahl der Ecken eingeben und danach die möglichen Kanten mit "1" oder "0" einfügen.
n = int(input("Wieviele Ecken soll der Graph haben (n>0)? "))
# Wir erzeugen die Eckenmenge
V = {1}
V.clear()
for i in range(1, n+1): # n+1 weil die obere Grenze exklusiv ist.
V.add(i)
print(V)
E = {"Dummy"}
E.clear()
for i in range(1, n):
for j in range(i, n):
Kante = int(input("Ist die Kante enthalten?"))
if Kante:
E.add((i,j))
print(V, E)
Zwei Dinge stören noch:
V = {} bezeichnet nicht die leere Menge, warum?
In die Benutzerabfrage in der Schleife hätte ich gerne den Namen der aktuellen Kante, zB "{i, j}". Wie kann ich das realisieren?
Danke und Grüße, Tyrax
Verfasst: Donnerstag 5. Februar 2009, 18:15
von EyDu
Tyrax hat geschrieben:V = {} bezeichnet nicht die leere Menge, warum?
Weil es das leere Dictionary ist. Wenn du die leere Menge möchtest, verwendet einfach "set()".
Tyrax hat geschrieben:In die Benutzerabfrage in der Schleife hätte ich gerne den Namen der aktuellen Kante, zB "{i, j}". Wie kann ich das realisieren?
Schau mal in der Doku unter "formatting".
Verfasst: Donnerstag 5. Februar 2009, 18:33
von Tyrax
EyDu,
sorry, dass {} ein dictionary ist, hätte ich selber nachlesen sollen. Ich würde das leere dictionary in Py3k ja lieber mit {:} bezeichnen, so dass {} für die leere Menge frei wird. Wahrscheinlich gibt's aber gute Gründe, warum es nicht so ist.
Die Doku zu "formatting" werde ich mir mal antun.
Grüße, Tyrax
Verfasst: Donnerstag 5. Februar 2009, 18:49
von numerix
Tyrax hat geschrieben:sorry, dass {} ein dictionary ist, hätte ich selber nachlesen sollen. Ich würde das leere dictionary in Py3k ja lieber mit {:} bezeichnen, so dass {} für die leere Menge frei wird. Wahrscheinlich gibt's aber gute Gründe, warum es nicht so ist.
Das dürfte schlicht daran liegen, dass Mengenliterale der Form {el1, el2} erst mit Python 3.0 eingeführt wurden und die Mengenklammern bis dahin ausschließlich Dictionaries vorbehalten waren. Ob es überhaupt eine gute Idee war, diese neue Schreibweise zuzulassen weiß ich nicht - das schafft neue Probleme, die es vorher so nicht gab.
Verfasst: Donnerstag 5. Februar 2009, 20:08
von Darii
ich weiß nicht ob es das ist was du suchst, aber ``itertools.combinations`` könnte das sein was du suchst.
Code: Alles auswählen
from itertools import combinations
V = ... # V irgendwie initialisieren
E = ...
for edge in combinations(V, 2):
if ...:
E.add(edge)
Verfasst: Donnerstag 5. Februar 2009, 21:26
von Tyrax
Hallo Darii,
das könnte passen, ich seh's mir an, danke.
Grüße, Tyrax
Verfasst: Freitag 6. Februar 2009, 09:15
von birkenfeld
derdon hat geschrieben:Ich habe nicht ganz verstanden, was du vorhast, Mengen werden in Python mit der BIF set bzw frozenset erstellt. Vor der for-Schleife gehört eine If-Abfrage, das kann man nicht so kurz schreiben, wie du es möchtest. Suchst du evtl. die BIF zip?
BTW, über "BIF" musste ich erst eine Weile nachdenken. Wozu Abkürzungen verwenden, wenn sie keiner versteht?
Verfasst: Freitag 6. Februar 2009, 09:40
von Leonidas
birkenfeld hat geschrieben:BTW, über "BIF" musste ich erst eine Weile nachdenken. Wozu Abkürzungen verwenden, wenn sie keiner versteht?
Gut dass ich nicht der einzige doofe bin der nicht sofort unter "BIF" "built-in function" versteht.
Zudem ``set`` und ``frozenset`` eigentlich etwas mehr als nur Funktionen sind.
Verfasst: Freitag 6. Februar 2009, 14:38
von birkenfeld
Leonidas hat geschrieben:
Zudem ``set`` und ``frozenset`` eigentlich etwas mehr als nur Funktionen sind.
Da kann man allerdings niemandem einen Vorwurf machen, da sie in der Library Reference als solche dokumentiert sind.

Verfasst: Freitag 6. Februar 2009, 16:12
von derdon
birkenfeld hat geschrieben:derdon hat geschrieben:Ich habe nicht ganz verstanden, was du vorhast, Mengen werden in Python mit der BIF set bzw frozenset erstellt. Vor der for-Schleife gehört eine If-Abfrage, das kann man nicht so kurz schreiben, wie du es möchtest. Suchst du evtl. die BIF zip?
BTW, über "BIF" musste ich erst eine Weile nachdenken. Wozu Abkürzungen verwenden, wenn sie keiner versteht?
In dem Python-Buch, das ich lese ("Core Python Programming") wird dieser Begriff verwendet. Ich dachte, das diese Abkürzung vielen bekannt sei. In Zukunft werde ich "built-in function" schreiben.