2015-02-24 97 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