Python:将n-tuple转换为x-tuple,其中x< ñ

时间:2013-11-26 06:12:43

标签: python python-2.7 tuples

问题非常简单(与标题不同)。我有一个类型的元组:

p = (1, 2, 3, 4, 5, 6)
# I refer to this as a 6-tuple but p could be an n-tuple

我需要将其转换为更小的元组,如:

(a, b) = p

a <- 1b <- (2, 3, 4, 5, 6)

编辑:

我需要Python v2.7的代码。此外,我应该提到有办法做到这一点,但我正在寻找一些自然而且我不需要处理指数的东西。例如。

a, b, c, d, e = p[0], p[1], p[2], p[3], p[4], p[5:]

是不可取的。

编辑2:

在上面的例子中,a是一个整数,而b是我们的新元组。 n元组到x元组背后的想法是新元组的长度小于原始元组的长度。在以下示例中,我们有0元组(整数):

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

但是,如果是以下内容:

a, b, c, d = (1, 2, 3)

然后,我们有a <- 1, b <- 2, c <-3, d <- None/Nothing

5 个答案:

答案 0 :(得分:3)

一般解决方案:

def split_after(lst, n):
    for i in range(n):
        yield lst[i]
    yield lst[n:]

结果:

>>> a,b,n = split_after(p,2)
>>> a
1
>>> b
2
>>> n
(3, 4, 5, 6)
>>> l = list(split_after(p,3))
>>> l
[1, 2, 3, (4, 5, 6)]

所以你需要知道左边有多少项并告诉函数(因为它不能自己说明,不像Python 3中的扩展元组解包语法允许你这样做)。

答案 1 :(得分:2)

你可以这样做

a, b = p[0], p[1:]

这是示例

>>> p = (1,2,3,4,5)
>>> a, b = p[0], p[1:]
>>> a
1
>>> b
(2, 3, 4, 5)

答案 2 :(得分:2)

如果你使用的是Python 3,那么使用extended iterable unpacking语法很简单:

>>> p = (1, 2, 3, 4, 5, 6)
>>> a, *b = p
>>> a
1
>>> b
[2, 3, 4, 5, 6]

b被列入一个列表,因为RHS可以是任何可迭代的,但如果你真的需要它是一个元组,你可以b = tuple(b)

这与后面的示例略有不同:

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

这种语法在Python 2中已经合法,并且在LHS和RHS具有相同数量的项目的情况下将做正确的事情。这是唯一的案例,它可以在Python 2中使用,而无需使用索引。

使用*也可以在Python 3中使用,但是你附加的变量总是是一个列表 - 即使它只有一个项目:

>>> a,b,*c = (1, 2, 3)
>>> c
[3]

但是在你的上一个例子中,它会大致按照你想要的那样做:

a, b, c, *d = (1, 2, 3)
>>> d
[]

即,d是一个空列表,而不是None

答案 3 :(得分:1)

在Python2中,RHS必须解包到正确数量的项目以匹配LHS。你可以避免像这样的黑客指数。但是你仍然需要知道解开那里的物品数量。

>>> p = (1, 2, 3, 4, 5, 6)
>>> a, b = (lambda a, *b:(a, b))(*p)
>>> a
1
>>> b
(2, 3, 4, 5, 6)

答案 4 :(得分:0)

这将基于拆分索引列表递归地拆分列表。

def split(lis, splits):
    if not splits:
         return [lis]
    new_splits = [s - splits[0] for s in splits[1:]]
    return [lis[:splits[0]]] + split(lis[splits[0]:], new_splits)

用法

>>> split([1,2,3,4,5,6],[2])
    [[1,2], [3,4,5,6]]

>>> split([1,2,3,4,5,6],[2,4])
    [[1,2], [3,4], [5,6]]

>>> split([1,2,3,4,5,6],[2,4,8])
    [[1,2], [3,4], [5,6], []]

您可以这样使用:

>>> a,b,c,d = split([1,2,3,4,5,6],[2,4,8])