Se una funzione restituisce due valori, come li aggiungi direttamente a due elenchi separati direttamente dal risultato della funzione? Qualcosa come questo:
def get_stuff():
return [3,4,5], [9,10,11]
stuffed_one = [1,2,3]
stuffed_two = [6,7,8]
# How do I add directly from the next line, without the extra code?
lst_one, lst_two = get_stuff()
stuffed_one += lst_one
stuffed_two += lst_two
Assumere get_stuff
restituisce sempre 2 elenchi (incluse le liste vuote).
risposte:
0 per risposta № 1Esattamente come hai fatto tu. Stai ottenendo una tupla di due elenchi, estrai ognuno di essi e aggiungili. Se vuoi, puoi essere fantasioso con zip (), ma per i casi di due elenchi non mi preoccuperei.
>>> def foo():
... return [1,2,3], [4,5,6]
...
>>> l1=["a", "b"]
>>> l2=["d", "e"]
>>> l1, l2=map(lambda x: x[0]+x[1], zip((l1, l2), foo()))
>>> l1
["a", "b", 1, 2, 3]
>>> l2
["d", "e", 4, 5, 6]
>>>
0 per risposta № 2
Con un leggero abuso di a for
loop, puoi usare itertools.starmap
.
from itertools import starmap
def get_stuff():
return [3,4,5], [9,10,11]
stuffed_one = [1,2,3]
stuffed_two = [6,7,8]
for _ in starmap(list.extend, zip([stuffed_one, stuffed_two], get_stuff())):
pass
zip
restituisce un iteratore che fornisce le tuple (stuffed_one, [3,4,5])
e (stuffed_two, [6,7,8])
. starmap
userà quelle tuple come liste di argomenti per chiamate successive a list.extend
(nota che list.extend(stuffed_one, [1,2,3])
è essenzialmente lo stesso di stuffed_one.extend([1,2,3])
). Da starmap
restituisce un iteratore, hai solo bisogno di un modo per chiamare effettivamente ogni invocazione di list.extend
, che significa iterare con il ciclo for.