Funktion zur Listenvereinigung

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
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
pythonneuling
User
Beiträge: 3
Registriert: Mittwoch 9. November 2005, 22:16

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
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).
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Oh, das kannte ich auch noch nicht!
Ist das ein builtin? Ab welche Version ist das mit drin?
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ein gravierender Nachteil des Hacks ist, dass es `__builtins__` offiziell gar nicht gibt. Das muss also nicht vorhanden sein.
Antworten