Seite 1 von 1

Liste durch Liste entstehen lassen

Verfasst: Montag 30. November 2015, 10:37
von BMTP
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?

Re: Liste durch Liste entstehen lassen

Verfasst: Montag 30. November 2015, 10:52
von cofi
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]

Re: Liste durch Liste entstehen lassen

Verfasst: Montag 30. November 2015, 11:12
von BlackJack
Ich werfe dann mal den Begriff „list comprehension“ (LC) in den Raum.

Re: Liste durch Liste entstehen lassen

Verfasst: Montag 30. November 2015, 20:12
von bwbg
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.

Re: Liste durch Liste entstehen lassen

Verfasst: Dienstag 1. Dezember 2015, 09:45
von Hyperion
@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]

Re: Liste durch Liste entstehen lassen

Verfasst: Dienstag 1. Dezember 2015, 17:56
von bwbg
Dies hatte ich in meinem ersten Entwurf auch vorgesehen. Der Klarheit wegen hatte ich auf diese zusätzliche magic-method verzichtet.