2015-02-24 137 views
-2

創建的元組的名單我有兩個列表:從兩個列表

list1 = [1, 2, 1, 2, 3, 2, 4, 1] 
list2 = [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p] 

我想創建一個元組的一個新的列表,將看起來像下面這樣:

result = [ 
      (a,), 
      (b, c), 
      (d,), 
      (e, f), 
      (g, h, i), 
      (j, k), 
      (l, m, n, o), 
      (p,) 
      ] 
+1

歡迎堆棧溢出!看起來你希望我們爲你寫一些代碼。儘管許多用戶願意爲遇險的編碼人員編寫代碼,但他們通常只在海報已嘗試自行解決問題時才提供幫助。證明這一努力的一個好方法是包含迄今爲止編寫的代碼,示例輸入(如果有的話),期望的輸出以及實際獲得的輸出(控制檯輸出,堆棧跟蹤,編譯器錯誤 - 無論是適用)。您提供的細節越多,您可能會收到的答案就越多。 – 2015-02-24 11:37:03

+0

如果list1是'[1,2,1,2,3,2,4,4]'怎麼辦? – 2015-02-24 11:38:51

+0

sum(list1)總是等於len(list2) – rem 2015-02-24 11:44:35

回答

1

你可以這樣做在發電機:

def divvy_up(lst, lengths): 
    pos = 0 
    for length in lengths: 
     yield tuple(lst[pos:pos + length]) 
     pos += length 

這將產生從lst對各長度的元組在指定:

>>> import string 
>>> list1 = [1, 2, 1, 2, 3, 2, 4, 1] 
>>> list2 = list(string.ascii_lowercase[:16]) 
>>> list2 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p'] 
>>> list(divvy_up(list2, list1)) 
[('a',), ('b', 'c'), ('d',), ('e', 'f'), ('g', 'h', 'i'), ('j', 'k'), ('l', 'm', 'n', 'o'), ('p',)] 

將其擴展到任何迭代(如列表,而不是序列),你可以在這裏使用itertools.islice()

from itertools.islice 

def divvy_up(it, lengths): 
    it = iter(it) 
    for length in lengths: 
     yield tuple(islice(it, length)) 
+0

靈活的規則! :P – Kasramvd 2015-02-24 11:47:47

+0

thx,按我想要的方式工作 – rem 2015-02-24 11:56:00

0
cumsum = [sum(list1[0:i]) for i in range(1, len(list1) + 1)] 
[tuple(list2[a:b]) for a, b in zip([None] + cumsum[0:-1], cumsum)] 

正好給出了答案

+0

對於示例數據沒有問題,但如果list1包含大量元素,則會有點浪費。在正常的'for'循環中生成'cumsum'會更好,而不是列表理解。當然,列表comp可以在一行中完成,但等價的簡單for循環通常更快。在這種情況下,它會快很多,因爲它不需要每次重新計算源列表開始處的總和。 – 2015-02-24 13:02:00

+0

#PM 2Ring, 恩。你是對的,它只適用於小列表。 另外,如果它是python3.2 +我們只使用itertools.accumulate。我相信它需要性能。 或者對於更大的列表,我們可以使用numpy.accumulate – Retard 2015-02-24 13:07:39