我想扩展名单
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)。 你有什么想法吗?
答案 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)
您可能希望了解list
和tuple
及其差异: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)