将部分结果附加到python中的列表中

时间:2013-07-04 07:39:14

标签: python

有一些方法可以输出两个变量,例如:

def some_method():
    #some calculations
    return first_value, second_value

现在我想将一行结果放入变量和列表中(将first_value放入某个变量,将second_value添加到列表作为新元素。)

我知道我可以这样做:

def some_method(list):
    #some calculations
    return first_value, list+[second_value]

然后:

some_variable, list = some_method(list)

但是有没有机会在一行中没有传递列表作为方法参数?

5 个答案:

答案 0 :(得分:1)

如果你真的想要它,你可以将列表子类化并制作如下:

>>> def f():
...     return 1, 2

>>> class MyList(list):
...     def __setattr__(self, name, value):
...         if name == '_assign_append':
...             self.append(value)
... 

>>> l = MyList()

>>> a, l._assign_append = f()
>>> a
1
>>> l
[2]
>>> b, l._assign_append = f()
>>> a
1
>>> b
1
>>> l
[2, 2]

答案 1 :(得分:1)

你能否在列表中返回第二个值?

像这样:

>>> L = [1, 2, 3]
>>> def bar():
...     return 'shenanigan', [4]
... 
>>> myVar, L[len(L):] = bar()
>>> L
[1, 2, 3, 4]
但是,你可以将第二个返回值分配给一个中间变量,然后使用list.append(),使用两行。

答案 2 :(得分:1)

使用函数装饰器,如下所示:

def remember_history(f):
    l = []
    def wrapper(*args,**kw):
        x,e = f(*args,**kw)
        l.append(e)
        return x,l
    return wrapper

def some_method():
    return 1,2

f = remember_history(some_method)
print f() # 1,[2]
print f() # 1,[2,2]
print f() # 1,[2,2,2]

答案 3 :(得分:0)

不是没有两次调用该函数:

>>> L = []
>>> def foo():
...     return 1, 2
... 
>>> myvar, L = foo()[0], L+[foo()[1]] 
>>> myvar
1
>>> L
[2]

答案 4 :(得分:0)

>>> L = []
>>> def foo():
...     return 1, 2
... 
>>> myvar, _ = tuple(process(i) for process, i in zip((lambda x: x, lambda x: L.append(x)), foo()))
>>> myvar
1
>>> L
[2]

这满足了它应该是单行的要求,但对我来说似乎很难看。

我更喜欢使用装饰器。