Liste durch Liste entstehen lassen

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
BMTP
User
Beiträge: 11
Registriert: Samstag 21. November 2015, 11:53

Hallo Leute,

ich wusste nicht wirklich wie ich meine Idee formulieren sollte, daher hoffe ich dass jemand versteht worauf ich hinaus möchte. Nehmen wir mal an wir haben eine Liste mit boolschen Ausdrüken, also z.B. 4>5 und nun will man eine Liste die parallel dazu True oder False ausgebt,d.h.:
list1 = [4>5; 4<5]
list2 = [false;true]

Wie kann man das erreichen?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wenn man das mal tatsaechlich in gueltigem Python schreibt, sieht man dass es das so nicht geben kann:

Code: Alles auswählen

In [1]: [4 >5, 4<5]
Out[1]: [False, True]
BlackJack

Ich werfe dann mal den Begriff „list comprehension“ (LC) in den Raum.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ohne Anspruch auf Vollständigkeit oder Richtigkeit. Meine Glaskugel ist etwas stumpf.

Code: Alles auswählen

#!/usr/bin/env python3
import operator

class BinaryOperation:
    def __init__(self, symbol, function):
        self.symbol = symbol
        self.function = function
        
    def apply(self, x, y):
        return self.function(x, y)


class BinaryExpression:
    def __init__(self, operation, x, y):
        self.operation = operation
        self.x = x
        self.y = y
    
    def __str__(self):
        return '{x} {op} {y}'.format(x=self.x, y=self.y,
                                     op=self.operation.symbol)
    
    __repr__ = __str__
    
    def apply(self):
        return self.operation.apply(self.x, self.y)
        

EQ = BinaryOperation('==', operator.eq)
LT = BinaryOperation('<', operator.lt)
GT = BinaryOperation('>', operator.gt)

def main():
    expressions = [
        BinaryExpression(EQ, 3, 4),
        BinaryExpression(LT, 5, 6),
        BinaryExpression(GT, 3, 4),
    ]
    
    results = [e.apply() for e in expressions]
    
    print(expressions)
    print(results)

    
if __name__ == '__main__':
    main()
PS.: Die Code-Vorschau funktioniert (für mich) leider immer noch nicht.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@bwbg: Du könntest aus ``apply`` noch ``__call__`` machen, dann kannst Du eine Expression direkt aufrufen:

Code: Alles auswählen

results = [e() for e in expressions]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Dies hatte ich in meinem ersten Entwurf auch vorgesehen. Der Klarheit wegen hatte ich auf diese zusätzliche magic-method verzichtet.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten