wildcards
Hallo!
ich habe eine Liste von Integer-Pärchen (sollen als Kanten in einem gerichteten Graphen interpretiert werden) und ich möchte jetzt prüfen, ob die In- und Outdegrees jedes Knotens mindestens gleich 1 sind (alle Knoten sollen in diesem Sinne "relevant" sein).
Sehr einfach wäre daß zu lösen, wenn ich abfragen könnte, ob [2,*] und [*,2] in der Liste enthalten sind. Gibts bei Python so ein * Symbol?
grüße,
4bit.
ich habe eine Liste von Integer-Pärchen (sollen als Kanten in einem gerichteten Graphen interpretiert werden) und ich möchte jetzt prüfen, ob die In- und Outdegrees jedes Knotens mindestens gleich 1 sind (alle Knoten sollen in diesem Sinne "relevant" sein).
Sehr einfach wäre daß zu lösen, wenn ich abfragen könnte, ob [2,*] und [*,2] in der Liste enthalten sind. Gibts bei Python so ein * Symbol?
grüße,
4bit.
Code: Alles auswählen
In [5]: def check_pair(pair, must_have=2):
...: return pair[0] == must_have or pair[1] == must_have
...:
In [6]: check_pair([2, 9])
Out[6]: True
In [7]: check_pair([1, 9])
Out[7]: False
In [8]: check_pair([1, 2])
Out[8]: True
In [9]: check_pair([2, 2])
Out[9]: True
das ist nicht was ich meine.
Mit dieser Zeile frage ich ab ob [5,4] in der Liste enthalten ist. Gibt es ein wildcard symbol, sodaß ich abfragen kann ob zum Beispiel [5,*] in der liste enthalten ist?
ich möchte entscheiden ob für alle Zahlen zwischen 1 und n in der liste Pärchen enthalten sind, die jeweils mit dieser Zahl beginnen und enden.
Wegen den Tupeln: theoretisch ja, aber mir ist es noch nie passiert, daß die Reihenfolge der Elemente einer Liste sich plötzlich ändert. Für meine Zwecke ist eine Liste gut genug.
Code: Alles auswählen
liste = [[5,4],[6,8],[9,0]]
In [5]: [5,4] in liste
Out [6]: True
ich möchte entscheiden ob für alle Zahlen zwischen 1 und n in der liste Pärchen enthalten sind, die jeweils mit dieser Zahl beginnen und enden.
Wegen den Tupeln: theoretisch ja, aber mir ist es noch nie passiert, daß die Reihenfolge der Elemente einer Liste sich plötzlich ändert. Für meine Zwecke ist eine Liste gut genug.
@4bit: Du musst die `check_pair()`-Funktion eben auf alle Elemente anwenden. Zum Beispiel in Verbindung mit `any()`. ``any(imap(check_pair, liste))`` mit `itertools.imap()`.
`check_pair` müsste man so etwas einfacher ausdrücken können:
Wobei man da natürlich die Funktion auch weglassen könnte und nur ``any(2 in p for p in liste)`` schreiben kann.
`check_pair` müsste man so etwas einfacher ausdrücken können:
Code: Alles auswählen
return must_have in pair
Code: Alles auswählen
>>> any([5,num] in liste for num in xrange(10))
True
Edit: BlackJack war schneller und hats schöner
Zuletzt geändert von derdon am Montag 3. August 2009, 13:46, insgesamt 1-mal geändert.
Klappt doch immer noch:
Das mit dem Tuple meinte ich eher vom deskriptiven Ansatz her. Ich bin halt der Meinung, dass ein Pärchen damit besser als mit einer Liste beschrieben wird.
Code: Alles auswählen
In [13]: for elem in [(5, 4), (6, 8), (9, 0)]:
....: print '%s -> %s' % (elem, check_pair(elem, 5))
....:
....:
(5, 4) -> True
(6, 8) -> False
(9, 0) -> False
Nein, es gibt kein solches Symbol. Aber du kannst dir leicht eins definieren:
MFG HerrHagen
Code: Alles auswählen
>>> class MatchAnything:
def __eq__(self, other):
return True
>>> ANY = MatchAnything()
>>> (3, 4) == (3, ANY)
True
>>> (3, 4) == (4, ANY)
False
>>> (4, ANY) in [(4,5), (6,4)]
True
@HerrHagen:
Ich habe gerade versucht deine Lösung für die wildcards zu nutzen und festgestellt, daß es bei mir nicht funktioniert, weil ich listen anstatt tupel vergleichen will. funktioniert __eq__ bei tupeln anders, als bei listen?
grüße,
4bit.
Ich habe gerade versucht deine Lösung für die wildcards zu nutzen und festgestellt, daß es bei mir nicht funktioniert, weil ich listen anstatt tupel vergleichen will. funktioniert __eq__ bei tupeln anders, als bei listen?
grüße,
4bit.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Du hast das Snippet nicht verstanden, deshalb gehts in die Hose.
Das Objekt gibt bei _jedem_ Vergleich auf Gleichheit ``True`` zurueck.
"Nicht funktioniert" ist uebrigens "Nicht hilfreich".
Das Objekt gibt bei _jedem_ Vergleich auf Gleichheit ``True`` zurueck.
"Nicht funktioniert" ist uebrigens "Nicht hilfreich".
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Ich nehm mal an du hast tuple mit listen verglichen. Deren Vergleich endet jedoch immer negativ (ein tuple ist nunmal keine Liste). Unabhängig ob ein ANY enthalten ist.
PS: Das ganze funktioniert übrigens auch verschachtelt:
Code: Alles auswählen
>>> [3] == (3)
False
Code: Alles auswählen
>>> [1,2,[ANY,[3]]] == [1,2,[9,[3]]]
True
was mit noch nicht klar ist: wenn ich zwei objekte vergleiche, hat jedes eine eigene vergleichsmethode, die gegenteilige antworten liefern können. zum beispiel ANY == "einstring" gibt true zurück. die _eq_ vom string müßte aber eigentlich false zurückgeben, da ANY ja kein string ist.
besteht dieser konflikt wirklich? und wenn ja, gilt hier das prinzip: was der programmierer festlegt ist wichtiger als interne methoden?
grüße,
4bit.
besteht dieser konflikt wirklich? und wenn ja, gilt hier das prinzip: was der programmierer festlegt ist wichtiger als interne methoden?
grüße,
4bit.
Die Aussage mag stimmen trotzdem vergleichst du hier eine Liste mit einer ZahlHerrHagen hat geschrieben:Ich nehm mal an du hast tuple mit listen verglichen. Deren Vergleich endet jedoch immer negativ (ein tuple ist nunmal keine Liste). Unabhängig ob ein ANY enthalten ist.Code: Alles auswählen
>>> [3] == (3) False
Ein Tupel würde so aussehen:MfG
HWK
Code: Alles auswählen
(3,)
HWK
@4bit: Die String Methode für den Gleichheitstest gibt nicht False sondern NotImplemented zurück.
Das veranlasst Python dazu, bei der anderen Seite Nachzuschauen:
Dort kommt ein verwertbares Ergebnis raus, was Python dazu veranlasst dieses zurückzugeben.
Code: Alles auswählen
>>> x = "Test".__eq__(ANY)
>>> x
NotImplemented
Code: Alles auswählen
>>> ANY.__eq__("test")
True
stimmt. wie seltsam.
Code: Alles auswählen
>>> type((3))
<type 'int'>
>>> type((3,))
<type 'tuple'>
>>>