Python-Funktion parameter: Tupel/Liste
Meine Funktion erwartet eine Liste oder ein Tupel als parameter. Es spielt nicht wirklich, was es ist, alle es tut, ist, übergeben Sie es an eine andere Funktion akzeptiert entweder eine Liste oder Tupel:
def func(arg): # arg is tuple or list
another_func(x)
# do other stuff here
Nun muss ich ändern Sie die Funktion leicht zu verarbeiten, wird ein zusätzliches element:
def func(arg): #arg is tuple or list
another_func(x + ['a'])
# etc
Leider ist dies nicht zur Arbeit gehen: wenn die arg-Tupel, muss ich sagen x + ('a',)
.
Offensichtlich, ich kann damit es funktioniert, indem die Nötigung arg in der Liste. Aber es ist nicht ordentlich.
Gibt es eine bessere Art, das zu tun? Ich kann nicht zwingen, Anrufern stets pass ein Tupel, natürlich, da es einfach Schichten zu arbeiten, um Ihnen.
- Wenn die andere Funktion akzeptiert entweder als ich würde ihn ein Tupel wird es schneller sein, für Sie zu arbeiten. Was dann nicht ordentlich über
tuple(x) + ('a',)
? - Sind die Tupel schneller in der Umsetzung?
- Bau eines Tupels von Strings und numerischen literalen ist schneller als das konstruieren einer Liste. Noch wichtiger ist,
tuple(x)
nur zurückx
wenn es bereits ein Tupel in der Erwägung, dasslist(x)
Kopienx
auch wenn es schon eine Liste. So durch die Nutzung der ein Tupel, schneiden Sie die meisten der Arbeit für die Hälfte Ihrer Eingabe Fälle. - +1: guter Punkt, um Tupel vs-Liste.
InformationsquelleAutor max | 2010-11-17
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn
another_func
will nur eine iterierbar, die Sie übergeben könnenitertools.chain(x,'a')
zu.Was über das ändern der anderen Funktion zu akzeptieren, eine Liste der Parameter statt ?
another_func
nimmt zwei Listen, warum ist es ein schlechtes design? Sagen wir, eine Liste "Liste oder Tupel von Spalten zu drucken", und der andere Liste oder ein Tupel aus Zeilen ausschließen von print". Wie und warum sollte ich ändern, um seine Schnittstelle?wie etwa:
Bearbeiten:
Re-Lektüre in Frage, ich denke, das ist mehr das, was Sie wollen (die Verwendung von
arg
undx
war ein wenig verwirrend):Wie schon andere gesagt haben, ist dies wahrscheinlich nicht der effizienteste Weg, aber es ist sehr klar. Wenn Ihr Tupel/Listen sind klein, ich könnte dies nicht über weniger klare Lösungen, die performance wird als vernachlässigbar. Wenn Ihre Listen sind groß, verwenden Sie das effizientere Lösungen.
extend
zurückNone
, wie es mutiert der Liste.Ausgabe:
f(*(tuple(args)+('a',))
ist besserWenn ein iterierbar ist genug Sie können
itertools.Kette
, aber bewusst sein, dass, wenn die FunktionA
(der erste genannt), auch iteriert über die durchsuchbar nach dem AufrufB
sind, dann könnten Sie Probleme haben, da iterables nicht rewinded. In diesem Fall sollten Sie sich für eine Sequenz oder verwenden Siedurchsuchbar.tee
, um eine Kopie der iterierbar:Obwohl
itertools.tee
ist nicht wirklich effizient, wennB
verbraucht alle oder die meisten der iterierbar, an diesem Punkt ist es einfacher zu umwandeln, nuriterable
zu einemtuple
oder einelist
.Mein Vorschlag:
Dies ist nicht sehr effizient, aber Sie wären besser dran vorbei änderbare Dinge, wenn du gehst zu sein, mutiert Sie.
Können Sie die Art der wiederholenden übergeben, um die erste Funktion zu konstruieren, was Sie an die zweite:
Haben Ihre Funktion übernehmen keine durchsuchbar. Dann nutzen Sie
itertools.chain
hinzufügen was auch immer Sequenz, die Sie wollen, um die durchsuchbar.Ich würde sagen, dass Santiago Lezica Antwort zu tun
ist die beste, weil es ist die einfachste. (keine Notwendigkeit zum import itertools Zeug und viel weniger lesbar Kette nennt). Aber nur verwenden, wenn Sie erwarten, dass t klein ist. Wenn t groß sein können, sollten Sie verwenden Sie eine der anderen Lösungen.