AW: AW: [Spam 42,42%] [Python-de] Listenvergleich

Rainer Fischbach fischbach at ecs-gmbh.de
Fre Jan 28 15:14:35 CET 2005


Hallo Harald


>hier sollte WENIGSTENS aus ls1 ein set gemacht werden...
>import sets
>def contains (ls1, ls2):
>         sls1=sets.Set(ls1)
>         for e in ls2:
>                 if e not in sls1:
>                         return False
>         return True
>
>(dabei natürlich darauf achten, daß ls1 die länger der beiden Listen ist.
>
>a in b ist O(n) wenn b eine Liste ist, und O(1) wenn B ein Set oder
>ein Dict ist.
>
>noch fixer ist allerdings
>import sets
>def contains (ls1, ls2):
>       return sets.Set(ls1).intersection(ls2)
>
>damit kommt eine  Menge der gemeinsamen Elemente zurück... dann mit
>len prüfen oder direkt die gemeinsamen verwenden.
>
>sets ist mein Lieblingsmodul :)))
>Harald

ich mag die sets ja auch und sicher geht der in-Test mit sets schneller.

Aber: 

1. nicht jede Liste lässt sich in ein set verwandeln (die Elemente müssen hashable sein)

2. die Umwandlung in ein set kostet auch etwas (Zeit und Speicher)

ich würde die Listen deshalb nicht lokal innerhalb der Testfunktion umwandeln, was dazu führen kann, dass man dieselbe Liste x-mal in ein set verwandelt, sondern, wenn ich weiß, dass die fraglichen Listen nur hashable Elemente enthalten, zuerst die Listen in sets umwandeln und dann mit diesen weiterarbeiten.

Rainer