如何使用一系列可变长度的序列解包?

时间:2016-01-07 16:22:59

标签: python list python-2.7 sequence variable-assignment

如果我事先知道列表的长度,我可以使用序列解包来为变量分配列表中的元素:

my_list = [1,2,3]

x, y, z = my_list

如果我事先不知道列表的长度,如何使用序列解包将变量分配给列表的元素?如果为了论证我不关心变量是如何命名的,我可以先得到列表的长度,然后解压缩到这个任意命名的变量吗?

3 个答案:

答案 0 :(得分:3)

当然推荐但可能:

my_list = [1, 2, 3]
for counter, value in enumerate(my_list):
    exec 'a{} = {}'.format(counter, value)
print a0, a1, a2

输出:

1 2 3

或者使用Python 3:

>>> a, *rest = my_list
>>> a
1
>>> rest
[2, 3]

答案 1 :(得分:2)

你可以强制列表的长度解压缩到你想要的大小

>>> my_list=range(10)
>>> a,b,c = my_list[:3]
>>> a
0
>>> b
1
>>> c
2
>>> my_list
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 

如果它们较少则会出现错误,否则您将获取3个第一个元素

对于较少元素的情况,你可以做这样的事情

>>> my_list=[1,2]
>>> x,y,z=(my_list[:3] +[-1]*3)[:3]
>>> x
1
>>> y
2
>>> z
-1
>>> 

有一个默认值的列表,您可以将其连接到my_list的子列表,也可以从结果中获取所需的内容

答案 2 :(得分:1)

正确的答案是你应该将这些元素留在列表中。这就是列表的用途。

错误的答案是以环形方式添加局部变量。对于Python 3:

ctr = 0
for value in my_list:
    __builtins__.locals()['my_list_{}'.format(ctr)] = value
    ctr += 1

如果my_listn项,则会创建变量my_list_0, my_list_1, ..., my_list_{n-1}

请不要这样做。