Senden zwei argument mit map und lambda-Funktionen und die Rückgabe von zwei Werten
Ich würde Sie gerne zwei Argumente in einer Funktion und erhalten Sie zwei Werte als auch
Möchte ich diesen code ändern, damit ich den code senden können, die zwei Argumente und zwei sowie
list_value = [ 1, 2,0,-1,-9,2,3,5,4,6,7,8,9,0,1,50]
hnd = map(lambda (valua): function_f(valua), list_value)
function_f ist eine Funktion eine Zahl, die entweder 1 oder 0.
Den oben genannten code, den job tun können, wenn die Versendung von einem argument, aber ich wollen, senden zwei statt.
das erste argument der Funktion erforderlich ist list_value und das zweite argument ist ein Modell "net-Modell Zug mit caffe"
also ich möchte eine Funktion schreiben, die das tun, die gleiche Arbeit von der vorherigen Funktion aber wieder zwei Argumente, die einer [0 oder 1] und die andere ist eine modifizierte Modell, das diese Funktion geändert hat.
- Können Sie erklären, ein besseres Beispiel, was Sie hier zu tun versuchen?
- deine Wortwahl ist seltsam, aber wenn Sie möchten, schreiben Sie eine Funktion, die zwei Eingänge und gibt zwei, die Sie tun können
lambda a, b: (a+b, b-a)
Sie brauchen, um wieder ein Tupel - Sie können nicht verwenden Sie diese Funktion, mit Landkarte
- kann er
zip
irgendwie ordnen Sie die Liste in Paaren? - Das wird viel einfacher, wenn Sie definieren das gewünschte Ergebnis, bevor Sie mit der Planung beginnen, wie man es, anstatt die andere Weise herum. Was wollen Sie am Ende das Ergebnis sein? Eine Liste der
(0 or 1, current model state)
Paare? Oder eine Liste mit "0 oder 1", zusammen mit den endgültigen Modell Stand? Oder etwas anderes? - Erklären kann er
- Nicht benötigt mit
map
; Sie weitergeben können mehrere iterables zumap
, und Sie werden jeweils verwendet als eine Quelle von positions-Argumente. Also, wenn Sie haben:map(lambda x, y: x + y, range(10), range(10, 20))
es passieren0, 10
, dann1, 11
usw.zip
ist nur erforderlich, wenn die jeweilige Funktion benötigt werden die Werte tupled in einem argument, eher als übergeben zwei Argumente. - können Sie uns zeigen, wie? Ich bin nicht sehr gut in python
zip
ing... - Sie brauchen, um ein Beispiel zu geben von dem, was Sie eigentlich hier wollen. Ist es ein einziges Modell-Objekt, das verwendet wird mit jeder Eingabe, geändert und wiederverwendet für den nächsten Beitrag? Oder ist es ein Modell für jeden Eingang?
- also, wenn ich Sie richtig verstehe, können Sie
map( lambda(a,b): a+b, list_value[::2], list_value[1::2] )
gehen über die Liste der paar-von-paar? - dies ist nicht meine Frage. Ich weiß nicht, was der OP will. Aber ich denke, ich könnte lernen, ein wenig von python auf dem Weg... Danke für Eure Hilfe!
- wenn möglich möchte ich die Funktion kann wie das tun list_value = [ 1, 2,0,-1,-9,2,3,5,4,6,7,8,9,0,1,50] hnd = map(lambda (walua): function_f(walua-Modell), die list_value), wo das Modell caffe-Modell
- Yup. Vorausgesetzt
list_value
ist auch die Länge; wenn nicht, die (schrecklichen) Py2map
ersetztNone
und führen zu den längsten der Eingang iterables, Py3map
(unditertools.imap
im Py2) Stoppt, wenn die kürzeste iterierbar ist erschöpft. - Danke! Ich bin ein wenig schlauer jetzt 🙂
- und warum ist der code, den Sie vorschlagen, nicht funktioniert?
- Ich werde es wieder versuchen, und vielen Dank für die Hilfe
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie sagen, Sie wollen nur ein einziges Modell, nicht ein neues Modell für jeden Wert, das ist ziemlich einfach. Ändern:
zu:
Nur sicherstellen, dass
function_f
gibt sowohl den neuen Wert und das Modell, z.B. wenn es zuvor nicht:nur es zu ändern:
Hinweis: Wenn Sie verwenden müssen
lambda
s zu verwendenmap
verwenden Sie nichtmap
; es erhält Sie nichts (ein generator-Ausdruck oder eine Liste der Verständigung laufen mit der gleichen Geschwindigkeit oder sogar noch schneller in den meisten Fällen, in denen die mapping-Funktion ist nicht eine CPython built-in). Das heißt, in Ihrem Fall brauchen Sie nicht einenlambda
, zum Beispiel, können Sie tun:oder einfach nur einen generator-Ausdruck (es sei denn, die Funktion ist ein Python-built-in implementiert in C,
map
im Grunde nie Gewinne Sie Leistung, wenn Sie nicht wollen, um darüber nachzudenken, obmap
geeignet ist, immer mit Liste Verstehens/generator expresssions stattmap
ist eine gute Idee):Durch die Verwendung von zip, die Sie verwenden können anzeigen mit einer solchen Funktion. Ich liefere ein Beispiel-code, wie Sie gebeten haben, zu zeigen,
zip
Ausgabetuple
alsv1
, und nicht geben Sie einen Wert fürv2
. Sie würde nicht die Ausgabe, die Sie zur Verfügung gestellt, Sie bekommen würde, eineTypeError
für die übergabe zu wenige Argumente zu derlambda
. Wie ich bereits in den Kommentaren, die Sie nicht brauchen/verwenden wollenzip
wenn nur das ziehen positionale Argumente aus verschiedenen iterables;map
Griffe bereits. Zu machen, arbeiten mitzip
müssten Sie entpacken diesetuple
s wieder, z.B. mititertools.starmap
.lambda
wenn die Funktion selbst nimmt schon die gleichen Argumente in der gleichen Reihenfolge.map(func, ls1, ls2)
dies zu tun wäre richtig, und viel mehr kurz und bündig.lambda
; wie gesagt, dein code ist falsch. Versuchen Sie tatsächlich ausgeführtmap(lambda (v1, v2): func(v1, v2), zip(ls1, ls2))
bricht es auch, in der gleichen Art und Weise (ich doppelt geprüft, weder Py2 noch Py3map
hat jeder Besondere Fall, der unterstützen würde, dass die Linie). Das ist, warum ich sagte, Sie wollen nichtzip
.lambda
; Sie waren Auspacken implizit, indem Sie (eine normalelambda
definiert ist, ohne Klammern um die Argumente, z.B.lambda x, y:
). Mit den Klammern funktioniert es, Sie packen Sie nurtuple
s mitzip
, dann Auspacken sofort/implizit in derlambda
. Sie müssen die Klammern, weilzip
, aber Sie übersehen, dass ich nicht mitzip
: ich schlugmap(func, ls1, ls2)
keinezip
überhaupt. Ohne diezip
/lambda
es schneller geht, und keineTypeError
.zip
zu meinem code (das nicht braucht), ich war Subtraktion Klammern aus dem code (die Sie benötigt). Versuchen Sie tatsächlich ausgeführtmap(func, ls1, ls2)
(keinezip
), werden Sie sehen, dass es funktioniert, und das ist verdammt viel präziser (und schneller). Als Regel gilt, wenn Sie brauchenlambda
zu verwendenmap
, dann sind Sie besser dran, nicht mitmap
(verwenden einer list-oder comp-generator-expr);map
werden langsamer, wenn Sie brauchen einelambda
.map(func, zip(ls1, ls2))
sollte eineTypeError
weilzip
wäre die Bereitstellung eines einzigentuple
arg anstelle von zwei Argumente zufunc
; mitmap(func, ls1, ls2)
es vorbei an zwei Argumente, eines von jedem Eingang iterierbar, passend zu den argsfunc
erwartet. Die erneute Eingabe Ihres Codes fürfunc
ich kann nur vervielfältigen, verwendenzip
. Ich kann nicht herausfinden, wie dieser bricht für Sie; ich nehme an, ein Fehler auf dem Teil, aber wer weiß? Das heißt, die Anzahl der zurückgegebenen Werte ausfunc
ist irrelevant; wennfunc
gibt zwei-Tupel, dannmap
erzeugen einen wiederholenden zwei-Tupel.map
zurücklist
, dass gab es Weg). Es geht nicht darum, 2.7 vs. 3.x; ich kann nicht reproduzieren Sie Ihr problem in der 2.7.