2017-09-03 140 views
1

延伸列表我要擴展的列表通過將列表轉換列表

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 ))))))'

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

+0

嘗試:'S =(0)+ s'但這不是一個名單,但一個'tuple',這真的低效的 「插入」在一個元組中。 –

+0

你提到了列表,但那些不是列表,那些是'tuple's(不可變的,vs可變的)) –

回答

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 S和tuple S和他們的區別:What's the difference between lists and tuples?。這是很容易使用,因爲它們提供的可用就地操作的列表來工作(它們不能被用來作爲字典鍵或存儲在set S)

+0

謝謝!問題是固定的:)我應該更多地瞭解元組.. –

1

s = 0, 1不是listtuple這是不可改變的。

最好使用適當的清單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,那麼答案來自@讓·弗朗索瓦·法布爾是要走的路。

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)