Python:从函数返回追加到多个列表

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

我正在寻找一种从函数返回的元组追加到几个列表的pythonic方法。

所以转这个:

def f():
  return (1,2)

a = []
b = []
for c in container:
  r1, r2 = f()
  a += [r1]
  b += [r1]

变成类似:

for c in container:
  a, b += f()

我的代码有点复杂(在循环内执行了一些操作),并且我有一个使用zip和list理解的版本,但是有点不可读:

list1, list2, list3 = zip (*[
           c( list(img.to(devices[i]) for img in images),
              features[i],
              [{k: v.to(devices[i]) for k, v in t.items()} for t in targets]
            )
            for i, c in enumerate(container)
        ])

如果我可以将列表理解变成常规的并且具有紧凑的附加方式,我认为可读性将大大提高。

提前感谢!

python list function append multiple
1个回答
0
投票

所以,对于这样的事情:

def f():
  return (1,2)

a = []
b = []
for c in container:
  r1, r2 = f()
  a += [r1]
  b += [r1]

将您的目标列表放入另一个列表,然后使用zip遍历比和相应的结果:

accumulators = [a, b]
for c in container:
    for acc, result in zip(accumulators, f()):
        acc.append(result) # NOT acc += [result]

是的,这种庞大的嵌套列表理解是完全不可读的。您也在此处滥用zip。有时候这个小技巧还可以,但是在这种情况下,它只是掩盖了正在发生的事情。您应该同时使用zip迭代多个可迭代对象,而不要使用i索引来实现。使用临时变量保存您的中间结果,我将它们称为arg1arg3,但在用例中使用了描述性名称。看看这有多清洁,您可以轻松地了解发生了什么:

accumulators = [list1, list2, list3]
for container, device feature in zip(containers, devices, features):

    arg1 = [img.to(device) for img in images]
    arg3 = [{k: v.to(device)} for k,v in t.items()} for t in targets]
    results = container(arg1, feature, arg2)

    for accumulator, result in zip(accumulators, results):
        accumulator.append(result)
© www.soinside.com 2019 - 2024. All rights reserved.