如何解开长度为n的元组到m(How to unpack tuple of length n to m

2019-06-23 22:15发布

这个问题已经在这里有一个答案:

  • 扩展的元组在Python 2拆包 4个回答

在Python 3我可以做以下(见PEP3132上扩展了Iterable开箱):

a, *b = (1, 2, 3)
# a = 1; b = (2, 3)

我能做些什么,以实现在Python 2.x的相同类似的优雅?


我知道我可以使用单元素访问和切片操作,但我不知道是否有一个更Python的方式。 到目前为止我的代码:

a, b = (1, 2, 3)[0], (1, 2, 3)[1:]
# a = 1; b = (2, 3)

Answer 1:

我发现,相关PEP3132给出的Python 2.x的一些例子还有:

许多算法需要在“第一,其余的”对拆分序列:

 first, rest = seq[0], seq[1:] 

[...]

此外,如果右边的值不是一个名单,但可迭代,它能够做切片之前被转换成一个列表; 避免创建这个临时列表中,一个不得不诉诸

 it = iter(seq) first = it.next() rest = list(it) 

在这个问题的答案给予其他的方法:

功能参数列表开箱方法

需要额外的函数定义/调用:

def unpack(first, *rest): 
  return first, rest
first, rest = unpack( *seq )

我不知道为什么它拆包函数的参数列表来实现,但不正常的元组拆包。

生成方法

学分 。 还需要自定义函数的实现。 是一种更灵活一点关于第一个变量的数目。

def unpack_nfirst(seq, nfirst):
  it = iter(seq)
  for x in xrange(nfirst):
    yield next(it, None)
  yield tuple(it)
first, rest = unpack_nfirst(seq, 1)

最Python的很可能是在上面的PEP提到的那些,我猜?



Answer 2:

我有了这个方便的小功能:

def just(n, seq):
    it = iter(seq)
    for _ in range(n - 1):
        yield next(it, None)
    yield tuple(it)

例如:

a, b, c = just(3, range(5))
print a, b, c
## 0 1 (2, 3, 4)

还与较少的参数:

a, b, c = just(3, ['X', 'Y'])
print a, b, c
## X Y ()

为响应评论,你也可以定义:

def take2(a, *rest): return a, rest
def take3(a, b, *rest): return a, b, rest
def take4(a, b, c, *rest): return a, b, rest
... etc

并使用它像这样:

p = (1,2,3)
a, b = take2(*p)
print a, b
## 1 (2, 3)


Answer 3:

我可能是错的,但据我所知

a, *b = (1, 2, 3)

对于切片和索引元组只是语法糖。 我觉得它有用,但不是很明显。



Answer 4:

我不认为有什么比你张贴的一个更好的办法,但这里是使用替代iter

>>> x = (1,2,3)
>>> i = iter(x)
>>> a,b = next(i), tuple(i)
>>> a
1
>>> b
(2, 3)


Answer 5:

不知道的情况下,但对于.pop(0)?

我看到有在你的榜样元组,但是如果你想要做的那种东西,你这样做,列表会更适合,我觉得呢? (除非有一些很好的理由,他们是不可改变的问题没有给出。)

b = [1,2,3]
a = b.pop(0)


文章来源: How to unpack tuple of length n to m