如何提取* args

时间:2018-09-24 11:35:01

标签: python python-3.x

import random 
liste = [random.randint(1, 5) for i in range(random.randint(2, 15))]]
a,*b,c = liste[0], liste[1:len(liste) - 1], liste[len(liste) - 1]

当我运行上面的代码时,没有得到我想要的结果。例如,对于b,我希望b为[4, 5, 2, 2, 3, 1, 4, 5, 4, 5, 3],但我得到[[4, 5, 2, 2, 3, 1, 4, 5, 4, 5, 3]]。为什么列表中有列表,我该如何解决?

基本上,我想知道我应该写些什么而不是liste[1:len(liste) - 1]。同样在我的要求中,我必须使用*b

3 个答案:

答案 0 :(得分:2)

如果您使用的是Python 3.5+,则可以改用:

a, *b, c = liste

,这样ac将成为liste列表中的第一项和最后一项,而b将是两者之间的子列表,这就是您的代码显然打算这样做。

答案 1 :(得分:0)

使用b代替*b。然后b将是值列表,而不是包含值列表的列表。

import random
liste = [random.randint(1, 5) for i in range(random.randint(2, 15))]
a, b, c = liste[0], liste[1:len(liste)-1], liste[len(liste)-1]
print(a, b, c, sep='\n')

输出:

3
[2, 1, 1, 1, 2, 3, 2, 1, 3, 1]
5

答案 2 :(得分:0)

给出一个可迭代的结果,左侧的星星会将所有不适合分配列表的初始和最终部分的元素吸收到一个列表中。

因此,您在这里有几个选择。首先是摆脱星星。您正在尝试将三个输入元素分配给输出元素:

a, b, c = liste[0], liste[1:-1], liste[-1]

注意我是如何缩短这些索引的,突然之间一切都变得清晰起来了。

您的第二个选择是也扩展右侧:

a, *b, c = listed

这仅在您试图从正面和背面截去一个元素的情况下有效。

最后,您始终可以将内容明确地写出来,而不用一路创建临时列表:

a = random.randint(1, 5)
b = [random.randint(1, 5) for _ in range(random.randint(0, 13)]
c = random.randint(1, 5)