如何在返回值中获取列表的一部分

时间:2017-05-05 01:01:44

标签: python

我想在方法中返回多个值,包括列表。

以下工作正常:

def foo():
  a = 42
  b = [1,2]
  return a, b

aa, b_list = foo()      
aa, (b1, b2) = foo()

但我不知道如何获得没有第一个元素的列表:

def bar():
  a = 42
  b = [1,2,3]
  return a, b

aa, (_, b_list) = bar()
print(b_list)  # Expecting [2,3]
# ValueError: too many values to unpack (expected 2)

是的,我可以获取列表并删除第一个元素,但是有一个单行吗?

这个功能应该是多功能的,例如应该支持两种情况:

aa, whole_list = foo()
aa, first_elem, rest_of_the_list = foo()

4 个答案:

答案 0 :(得分:5)

是的,有。您可以使用b_list解压缩:

aa, (_, *b_list) = bar()
  • 请注意,这仅适用于python 3。

答案 1 :(得分:1)

这称为list slice;您可以返回列表的连续范围,例如

return a, b[1:]

这个符号为你提供了元素1到最后 - 除了第一个元素之外的所有元素。

如果您需要在返回后删除第一个项目,只需使用相同的语法:

print(b_list[1:])

或永久改变(直到下一个作业)b_list

b_list = b_list[1:]

答案 2 :(得分:1)

不完全是一个衬垫,但我会尝试使用一个命名元组来使retval的性质更清晰

from collections import namedtuple
retval = namedtuple('retval', 'scalar list')

def bar():
  a = 42
  b = [1,2,3]
  return retval(a, b)

rv = bar()
a, b = rv.scalar, rv.list[1:]

答案 3 :(得分:-1)

所以根据我的理解,你想要得到一个42,然后回来是1,2,3

我会尝试

def bar():
  a = 42
  b = [1,2,3]
  return a, b

a, b = bar()
print(b)  # Expecting [2,3]
print(aa)