在python中,如果我有元素列表
l = ['a', 'b', 'c', 'd', 'e', 'f']
和一个数字列表
n = [2, 1, 3]
如何将列表l
拆分为n
中的数字?
获取此列表列表
[['a', 'b'], ['c'], ['d', 'e', 'f']]
答案 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')]