通过将列表插入列表来扩展列表

时间:2017-09-03 12:34:33

标签: python

我想扩展名单

s = 0,1

def hi(x):
    global s
    for i in range(x):
        s = 0,s
    return s

print hi(5)

这个结果将是'(0,(0,(0,(0,(0,(0,1(1))))))''

但我真正想要的是(0,0,0,0,0,0,1)。 你有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你可以:s= (0,)+s创建一个带有tuple的新0(而不是像你一样在每次迭代中嵌套元组。

但也许最好的方法是使用乘法(以避免循环)前置一个零元组:

s = (0,)*x + s

更令我烦恼的是需要使用global。我会将s作为参数传递:

def hi(x,s):
    return (0,)*x + s

print(hi(5,(0,1)))

产生以下tuple

(0, 0, 0, 0, 0, 0, 1)

您可能希望了解listtuple及其差异:What's the difference between lists and tuples?。由于他们提供了可用的就地操作(它们不能用作字典键或存储在set中),因此使用列表要容易得多< / p>

答案 1 :(得分:1)

s = 0, 1不是list,而是tuple,它是不可变的。

最好使用正确的列表s = [0, 1],然后使用insert()方法。

def hi(x, s):
    for _ in range(x):
        s.insert(0, 0)
    return s

或者事件更好地避免for循环:

def hi(x, s):
    return ([0] * x) + s

如果您想使用tuple,那么来自@ Jean-FrançoisFabre的答案就是您的选择。

答案 2 :(得分:0)

鉴于您的特定用例,Jean的答案会更好。但是如果你想将嵌套元组变成单维元组,则更典型的操作称为flatten()flatten()采用任意嵌套的序列并将其“展平”为序列而不嵌套。 flatten()不包含在python标准库中,但是包含在许多其他语言中是非常有用的操作。我从here获取了以下实现,其中包括其他实现,并讨论了它们的优点和缺点。

def flatten(l, ltypes=(list, tuple)):
    ltype = type(l)
    l = list(l)
    i = 0
    while i < len(l):
        while isinstance(l[i], ltypes):
            if not l[i]:
                l.pop(i)
                i -= 1
                break
            else:
                l[i:i + 1] = l[i]
        i += 1
    return ltype(l)

用法很简单:

a = ((1, 2), (3,), (4, (5, 6)))
flatten(a)  # -> (1, 2, 3, 4, 5, 6)

a = hi(6)   # -> (0, (0, (0, (0, (0, (0, 1))))))
flatten(a)  # -> (0, 0, 0, 0, 0, 0, 1)