2011-12-13 53 views
6

我有一个函数,我返回两个值。我想将这两个值直接放入两个不同的数组中。我知道如何将输出作为两个不同的值返回以后添加到数组中,但我不想拥有临时占位符。一个例子如下所示。Python - 从函数返回多个值到不同的阵列

def two_outputs(): 
    output_one = 5 
    output_two = 6 
    return output_one, output_two 

one_array = []  # initialize array 
two_array = []  # initialize array 

a, b = two_outputs() # get values 

one_array.append(a) # store first value in first array 
two_array.append(b) # store second value in first array 

理想情况下,我想不使用a和b,并且必须在代码的后面添加。我想将函数的输出直接附加到两个数组中。这甚至有可能吗?

感谢您的任何帮助。我希望我做到了这一点,因为这是我的第一篇文章。你们已经帮助我很多编程问题了。

更新:我猜根据下面的回答,这是不可能直接做到这一点。感谢大家帮助找到其他方法来实现目标。

+2

你为什么要这样做?临时占位者有什么问题? – tkone 2011-12-13 19:31:58

+1

我正在做很多工作,从数据库中收集信息,创建返回许多值的函数。我不喜欢临时占位符,因为它增加了代码的步骤,并且我希望代码更小/更短。除此之外,没有技术上的原因。我只是好奇,如果有可能直接获取函数的输出到两个不同的数组(或更多)。根据下面的答案,看起来这是不可能的。 – ruffryder 2011-12-13 19:45:05

回答

1

假设我正确地理解了你,你需要在声明函数之前定义你的数组。

one_array, two_array = [], [] 

def two_outputs(): 
    one_array.append(5) 
    two_array.append(6) 

#call function 
two_outputs() 

print one_array, two_array 
#[5] [6] 
5

如何使用帮助函数?

def zippend(lists, values): 
    assert len(lists) == len(values) 
    for l,v in zip(lists, values): 
    l.append(v) 

zippend((one_array, two_array), two_outputs()) 

功能zippend有两个参数。第一种是可迭代的List s(你所说的“数组”实际上是Python中的List s)。第二个是要附加到这些列表的值的迭代。

只要列表数量与值的数量相匹配(每个列表一个值),它就可以根据需要采用任意数量的列表和值。

编辑:如果two_outputs()他们回来的List秒的元组要连接到one_arraytwo_array,那么你可以更改功能使用extend而不是append

def zextend(lists, values): 
    assert len(lists) == len(values) 
    for l,v in zip(lists, values): 
    l.extend(v) 

或者,如果你真的想到,您可以使用一个具有if语句的单个函数,该语句检查它得到的是哪种类型的值,并根据情况编辑appendextend

+2

我建议名称“zippend”。 – 2011-12-13 19:35:43

1

你总是可以改变你的函数返回列表的元组:

def test(): 
    # some code 
    return [a], [b] 

a, b = test() 

,这将使A和B名单时,他们正在返回

0

可以在一个行完成与以下发电机。对“任何”的调用只是使得生成器被消耗,因此其中的表达式被执行。

any(lst.append(item) for lst,item in zip((one_array, two_array), two_outputs())) 

NB。我不会推荐这种编程风格 - 阅读变得更加困难。 也许,如果它在那里太频繁了一个成语,我会写一个简短的辅助功能 像分配:

def multi_append(lists, multi_function, *args, **kw): 
    for lst, result in zip(lists, multi_function(*args, **kw)): 
     lst.append(result) 

而且在代码的“身体”,只写:

multi_append((array_one, array_two), two_outputs) 

为了完整起见,我添加了一个建议,允许您使用赋值运算符。

在这种情况下需要什么是一个自定义List对象,它具有执行追加的属性。创建这样的班级是2班,但是,他列出的代码必须来自这个班级:

class MList(list): 
    last = property(lambda s:s[-1], list.append) 

array_one, array_two = MList(), MList() 

array_one.last, array_two.last = two_outputs()