Python - 将多个值从函数返回到不同的数组

问题描述 投票:0回答:5

我有一个返回两个值的函数。 我想将这两个值直接放入两个不同的数组中。我知道如何将输出作为两个不同的值返回,以便稍后添加到数组中,但我不想使用临时占位符。下面显示了一个示例。

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,并且必须稍后在代码中附加。 我想将函数的输出直接附加到两个数组。这可能吗?

感谢您的帮助。 我希望我做得正确,因为这是我的第一篇文章。 你们已经在编程问题上帮助了我很多。

更新:我认为根据下面的回复,不可能直接执行此操作。 感谢大家帮助寻找其他方法来实现目标。

python arrays function
5个回答
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
的可迭代(您所说的“数组”实际上是 python 中的
List
)。 第二个是要附加到这些列表的可迭代值。

它可以接受任意数量的列表和值,只要列表的数量与值的数量匹配(每个列表一个值)。

编辑:如果

two_outputs()
要返回
List
的元组并连接到
one_array
two_array
,那么您可以更改函数以使用
extend
而不是
append

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

或者,如果您确实愿意,您可以使用一个带有 if 语句的函数,该语句检查它正在获取什么样的值,并根据需要进行

append
ed 或
extend
ed。


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]

1
投票

您始终可以更改函数以返回列表元组:

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

a, b = test()

返回时将同时生成 a 和 b 列表


0
投票

可以使用以下生成器在一行中完成。对“any”的调用只是为了 生成器被消耗,因此其中的表达式被执行。

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

注意。我不推荐这种编程风格——它变得更难阅读。 也许,如果这个习惯用法太频繁,我会编写一个简短的辅助函数 作业如:

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()

0
投票

一个简单的解决方案是使用

list
构造函数与
map
zip
函数的智能组合:

def two_outputs(x):
    return (x**2, x**3)
one_array, two_array = map(list, zip(*[two_outputs(x) for x in range(1, 5)]))
print(one_array, two_array)

输出:

[1, 4, 9, 16] [1, 8, 27, 64]

zip
函数首先返回所有元组的所有第一个元素。这些在返回
map
list
构造函数上得到
one_array
。接下来,
zip
返回所有第二个元素,这些元素再次映射到
list
上,导致
two_array

© www.soinside.com 2019 - 2024. All rights reserved.