Seite 1 von 1

Funktion zur Listenvereinigung

Verfasst: Mittwoch 9. November 2005, 21:57
von pythonneuling
Hallo,

ich habe zwei Listen oder Strings etc und möchte diese vereinigen. Mathematisch also die Vereinigungsmenge bilden. Momentan mach ich das so:

Code: Alles auswählen

def vereinige(a, b):
    ### create an empty list for intersection elements
    l = []
    ### iterate through sequence a and add all elements to the list
    for z in a :
        l.append(z)
    
    ### iterate through b and add all elements which are not already in the list
    for z in b:
        if (z not in l) :  l.append(z)
    return l
Funzt auch bei einfachen Strings.

Code: Alles auswählen

>>> a = "Hallo"
>>> b = "Hello"
>>> vereinige(a,b)
['H', 'a', 'l', 'l', 'o', 'e']
Aber bei diesem String z.B. nicht:

Code: Alles auswählen

>>> a = 'Hallo Ballo'
>>> b = "HelloBello "
>>> vereinige(a,b)
['H', 'a', 'l', 'l', 'o', ' ', 'B', 'a', 'l', 'l', 'o', 'e']
Da sind ja Elemente doppelt drin. Wie kann ich das ändern, das auch diese Strings bearbeitet werden?

Grüße

Verfasst: Mittwoch 9. November 2005, 22:20
von pythonneuling
Da hatte ich wohl 'nen Knick in der Optik. :idea: Hab den Fehler gefunden. Für Menge a muss ich natürlich auch die Abfrage machen ob es schon in der Liste ist. Tja, manchmal sieht man den Wald vor lauter Bäumen nicht. Sinnlos gepostet aber vielleicht interessierts ja doch jemanden.

Grüße

Verfasst: Mittwoch 9. November 2005, 22:41
von BlackJack
Wenn es Dir nicht auf die Reihenfolge ankommt, Mengen sind ja nicht geordnet, dann würde ich Mengen (englisch `set`) nehmen:

Code: Alles auswählen

In [5]: a = 'Hallo Ballo'

In [6]: b = 'Hello Bello'

In [7]: set(a) | set(b)
Out[7]: set(['a', ' ', 'B', 'e', 'H', 'l', 'o'])
Wenn Dir das mit der "Oder"-Verknüpfung zu "magisch" ist, dann haben Mengen-Objekte auch eine `union()` Methode (union=Vereinigung).

Verfasst: Donnerstag 10. November 2005, 06:20
von henning
Oh, das kannte ich auch noch nicht!
Ist das ein builtin? Ab welche Version ist das mit drin?

Verfasst: Donnerstag 10. November 2005, 06:44
von mitsuhiko
henning hat geschrieben:Oh, das kannte ich auch noch nicht!
Ist das ein builtin? Ab welche Version ist das mit drin?
Dabei ab python2.4
wenn du es auch in python2.3 haben willst:

Code: Alles auswählen

import sets
__builtins__.set = sets.Set

Verfasst: Donnerstag 10. November 2005, 06:54
von henning
Thnx. Hatte unter 2.3 jetzt schon 'ne eigene Klasse gschrieben, die aber auch ne leicht andere Funktion hat, ich brauchte nämlich einen Container, der mehrere gleiche Objekte zulässt.

Ich freue micht jetzt schon auf den Tag, wenn die Debian-Pakete für mod_python und soya auf 2.4 laufen (und mod_python dann auch noch funktioniert) ,o)

Verfasst: Donnerstag 10. November 2005, 16:56
von Leonidas
blackbird hat geschrieben:wenn du es auch in python2.3 haben willst:

Code: Alles auswählen

import sets
__builtins__.set = sets.Set
Das geht auch:

Code: Alles auswählen

from sets import Set as set

Verfasst: Donnerstag 10. November 2005, 17:51
von Joghurt
blackbird hat geschrieben:

Code: Alles auswählen

import sets
__builtins__.set = sets.Set
Oh! Evil, ugly hack!
Sollte man sich nicht angewöhnen. Leonidas' Lösung ist da eindeutig besser.

Verfasst: Donnerstag 10. November 2005, 18:06
von Leonidas
Joghurt hat geschrieben:Oh! Evil, ugly hack!
Der Vorteil von blackbirds Hack ist, dass man daduch Sets gleichzeitig in allen Modulen zu den Builtins hinzufügt, so dass importierte Untermodule auch gleich Sets haben, ohne sie importieren zu müssen. Jedoch ist das für meinen Geschmack etwas zu "magisch".

Verfasst: Freitag 11. November 2005, 00:02
von BlackJack
Ein gravierender Nachteil des Hacks ist, dass es `__builtins__` offiziell gar nicht gibt. Das muss also nicht vorhanden sein.