我正在寻找一种从函数返回的元组追加到几个列表的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)
])
如果我可以将列表理解变成常规的并且具有紧凑的附加方式,我认为可读性将大大提高。
提前感谢!
所以,对于这样的事情:
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
索引来实现。使用临时变量保存您的中间结果,我将它们称为arg1
和arg3
,但在用例中使用了描述性名称。看看这有多清洁,您可以轻松地了解发生了什么:
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)