Teilmengenbedingung in for-Schleifen?

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
Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

Donnerstag 5. Februar 2009, 16:20

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Donnerstag 5. Februar 2009, 16:28

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Donnerstag 5. Februar 2009, 16:32

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Donnerstag 5. Februar 2009, 16:34

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:

Code: Alles auswählen

menge = {"a", "b", "c", "d"}
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Donnerstag 5. Februar 2009, 16:39

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
Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

Donnerstag 5. Februar 2009, 17:26

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
Zuletzt geändert von Tyrax am Donnerstag 5. Februar 2009, 18:20, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 5. Februar 2009, 18:15

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".
Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

Donnerstag 5. Februar 2009, 18:33

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Donnerstag 5. Februar 2009, 18:49

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Donnerstag 5. Februar 2009, 20:08

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)


Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

Donnerstag 5. Februar 2009, 21:26

Hallo Darii,

das könnte passen, ich seh's mir an, danke.

Grüße, Tyrax
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 6. Februar 2009, 09:15

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?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 6. Februar 2009, 09:40

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 6. Februar 2009, 14:38

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. :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Freitag 6. Februar 2009, 16:12

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