如何从列表中解压缩四个变量?

时间:2014-05-28 00:51:44

标签: python python-2.7

我有这个清单:

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

我该如何解决这个问题?

4 个答案:

答案 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是您想要的元素数量

它将在4步中输出四个元素,给出输出:

1 2 3 4
5 6 7 8

列表中的元素必须是您为其分配的变量的倍数,否则您将无法获得上述输出中显示的所有元素。