问题非常简单(与标题不同)。我有一个类型的元组:
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 <- 1
和b <- (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
。
答案 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])