@MarcelF6:
Ich weiss nicht, was eure Aufgabenstellung/Zielsetzung war, allerdings ist das Problem sehr ungünstig gelöst, da Deine Rekursionen unnötigerweise den Entscheidungsbaum mehrfach ablaufen (daher kommen auch die Dopplungen, die Du wieder filtern musst).
Edit:
Wenn es unbedingt Rekursion sein soll, hier mal ein anderer Vorschlag:
Code: Alles auswählen
def seq(*args):
if len(args) == 1:
return args[0]
return seq(filter(lambda x: x in args[1], args[0]), *args[2:])
Die Funktion nimmt eine beliebige Anzahl von Strings/Iterables auf und konsumiert diese per Rekursion. Die Laufzeit sollte wesentlich besser sein als in Deinem Bsp.
Allerdings ist für diesen einfachen Anwendungsfall der Weg über sets, wie /me es gezeigt hat, allen eigenen Versuchen vorzuziehen. Sollte die Positionsangabe eine Rolle spielen, würde ich eher über ein Alphabetwörterbuch gehen:
Code: Alles auswählen
def seq(*args, **kwargs):
hits = kwargs.get('hits')
if not hits:
hits = len(args)
temp = {}
for i,s in enumerate(args):
for j,c in enumerate(s):
item = temp.setdefault(c, [[] for _ in xrange(len(args))])
item[i].append(j)
return filter(lambda kv: len(filter(bool, kv[1]))==hits, temp.iteritems())
Über hits kann man dann auch andere Häufigkeiten abfragen.