如何在Python中将多个返回值直接附加到列表中
如果函数返回两个值,如何从函数结果直接将它们附加到两个单独的列表中? 大概是这样的:如何在Python中将多个返回值直接附加到列表中,python,Python,如果函数返回两个值,如何从函数结果直接将它们附加到两个单独的列表中? 大概是这样的: 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 += l
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
假设
get\u stuff
总是返回两个列表(包括空列表)。与您的操作完全相同。您将得到一个由两个列表组成的元组,提取每个列表并附加它们。如果您愿意,您可以使用zip()来获得乐趣,但对于两个列表的情况,我不会费心
>>> 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]
>>>
只要稍微滥用
for
循环,就可以使用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
返回一个迭代器,该迭代器提供元组(填充一[3,4,5])
和(填充二[6,7,8])
starmap
将使用这些元组作为参数列表,用于连续调用list.extend
(注意list.extend(填充的[1,2,3])
与填充的[1,2,3])
基本相同。因为starmap
返回一个迭代器,所以您只需要一些方法来实际调用list.extend的每次调用,这意味着使用for循环进行迭代。是的,这与我之前的问题非常相似,我意识到我没有问清楚我需要什么,但这仍然是一个有效的问题;)为什么不在函数中添加它们呢?我想你不能。除非用其他额外代码替换现有的额外代码。对于固定数量(2)的列表,我认为您的代码是最简单和最可读的。很难将任何答案标记为正确。。。但是这里有一些很酷的技巧:)我真的不明白为什么你决定用map
调用作为例子;它混合了许多其他简单的分散注意力的东西(特别是对于python新手)。简单地做一下会更清楚:x,y=foo();l1+=x;l2+=x;l1;l2
。(可能避免使用小写的L
,因为它太像1
)@Bakuriu:问题的关键是在一行中实现同样的效果。@StefanoBorini问题是如何更直接地实现它,我不认为加入map()
,lambda
,和zip()
比原始代码更直接。只是更复杂。吻,啊!这显然是一个黑客行为。如果必须使用pass
才能使代码正常工作,则必须破坏某些东西。将map
/starmap
等与只产生副作用的功能一起使用是错误的。你甚至没有保存任何一行代码来尊重朴素的for
循环。我同意这是一种黑客行为,但它并没有仅仅为了映射函数的副作用而使用列表理解那么糟糕。没有只为丢弃而分配的列表;迭代器多次调用该函数,并且只丢弃返回值(None
),但无论如何,即使显式地进行了固定数量的调用,也会丢弃该值。从好的方面来说,这可以扩展到任意数量的列表进行修改(当然,只要列表已经在列表或其他可说出的列表中)。