我有这个清单:
varlist = ['1', 'King', 't', '1']
我试图在for
循环中解压缩这四个变量;
for var1, var2, var3, var4 in varlist:
post += len(var1)-len(var3)
post *= len(var2)/len(var4)
当我运行此循环时,我得到以下内容:
ValueError: need more than 1 value to unpack
我该如何解决这个问题?
答案 0 :(得分:8)
解包与迭代不同。你需要这样做:
var1, var2, var3, var4 = varlist
post += len(var1)-len(var3)
post *= len(var2)/len(var4)
这里不需要循环。
答案 1 :(得分:5)
你实际上无法做到这一点。有一个快速的黑客让它按照你的想法运作,但最终你想要做的事情是行不通的。这是快速破解:
varlist = ['1', 'King', 't', '1']
for var1, var2, var3, var4 in [varlist]: # note the brackets
post += len(var1)-len(var3)
post *= len(var2)\len(var4) # note that this line fails, because \ isn't /
你不能这样做的原因是for
循环迭代迭代中的每个元素并将该值分配给你告诉它的任何值。在这种情况下,varlist
中的第一个元素是'1'
,而不是('1','King','t','1')
。通过执行for <stuff> in [varlist]
,您可以将当前的varlist
包装在另一个列表中,然后对其进行迭代。 THAT的第一个元素是['1','King','t','1']
,它可以打包到var1, var2, var3, var4
。
我强烈建议您重新考虑您的设计,但这是否真的是您想要做的。如果你有很多varlist
s,这听起来很棒,否则就是这样做:
var1, var2, var3, var4 = varlist # unpack without the loop
post += len(var1) - len(var3)
post *= len(var2) / len(var4)
答案 2 :(得分:2)
我认为你不想要解包,你想要一种方法来对列表进行分组,并访问分组的各个元素,这可以用grouper
完成:
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
post = 0
varlist = ['1', 'King', 't', '1', 'lol', 'newbs', 'money', 'plox']
print list(grouper(varlist, 4))
# Prints: [('1', 'King', 't', '1'), ('lol', 'newbs', 'money', 'plox')]
for var1, var2, var3, var4 in grouper(varlist, 4):
post += len(var1)-len(var3)
post *= len(var2)/len(var4)
print post
# Prints: -2
答案 3 :(得分:1)
varlist = ['1', 'King', 't', '1']
for i,j,k,l in zip(*[iter(varlist)]*4):
print i,j,k,l
1 King t 1
如果您有varlist=[1, 2, 3, 4, 5, 6, 7, 8,9,10]
它将在4步中输出四个元素,给出输出:
1 2 3 4
5 6 7 8
列表中的元素必须是您为其分配的变量的倍数,否则您将无法获得上述输出中显示的所有元素。