按元素数拆分子列表中的列表

时间:2015-04-08 17:46:47

标签: python list split

在python中,如果我有元素列表

l = ['a', 'b', 'c', 'd', 'e', 'f']

和一个数字列表

n = [2, 1, 3]

如何将列表l拆分为n中的数字?

获取此列表列表

[['a', 'b'], ['c'], ['d', 'e', 'f']]

7 个答案:

答案 0 :(得分:7)

您可以使用islice

>>> from itertools import islice
>>> l = ['a', 'b', 'c', 'd', 'e', 'f']
>>> n = [2, 1, 3]
>>> it = iter(l)
>>> out = [list(islice(it, size)) for size in n]
>>> out
[['a', 'b'], ['c'], ['d', 'e', 'f']]

答案 1 :(得分:6)

它有点混淆,但仍然:

ll = [[l.pop(0) for _ in range(k)] for k in n]

请注意,由于pop()这个问题,此遍历不会保持列表完整。

答案 2 :(得分:3)

您可以从列表中创建一个迭代器。然后拨打next适当的次数。

>>> l = ['a', 'b', 'c', 'd', 'e', 'f']
>>> n = [2, 1, 3]
>>> it = iter(l)
>>> [[next(it) for i in xrange(k)] for k in n]
[['a', 'b'], ['c'], ['d', 'e', 'f']]

答案 3 :(得分:1)

又一种方式

if __name__ == '__main__':
  l = ['a', 'b', 'c', 'd', 'e', 'f']
  n = [2, 1, 3]

  result = []
  for i in n:
    j = l[:i]
    result.append(j)
    l = l[i:]

  print result

给出

[['a', 'b'], ['c'], ['d', 'e', 'f']]

它并不像其他一些解决方案那么短,但它确实可以读取

答案 4 :(得分:1)

cuts = [sum(n[:i]) for i in range(len(n) + 1)]
>>> [l[cuts[i]:cuts[i + 1]] for i in range(len(cuts) - 1)]
[['a', 'b'], ['c'], ['d', 'e', 'f']]

这使列表保持不变:

>>> l
['a', 'b', 'c', 'd', 'e', 'f']

答案 5 :(得分:0)

我认为这将是最优化的,因为它只需要len(n)个迭代次数。

l = ['a', 'b', 'c', 'd', 'e', 'f']
n = [2, 1, 3]

res = []
temp = 0
for i in n:
    res.append(l[temp:temp+i])
    temp = temp+i
print res

返回:

[['a', 'b'], ['c'], ['d', 'e', 'f']]

答案 6 :(得分:0)

您可以使用numpy.split

>>> np.split(l,[sum(n[:i]) for i in range(len(n))])
[array([], dtype=float64), array(['a', 'b'], 
      dtype='|S1'), array(['c'], 
      dtype='|S1'), array(['d', 'e', 'f'], 
      dtype='|S1')]