将列表根据另一个列表的索引拆分成块

3
我想使用另一个列表的值作为分割范围,将一个列表拆分成块。
indices = [3, 5, 9, 13, 18]
my_list = ['a', 'b', 'c', ..., 'x', 'y', 'z']

基本上,将 my_list 从范围中分离:

my_list[:3], mylist[3:5], my_list[5:9], my_list[9:13], my_list[13:18], my_list[18:]

我尝试将数据分成2个一组,但结果不是我需要的。

[indices[i:i + 2] for i in range(0, len(indices), 2)]

我的实际列表长度为1000。

3个回答

4

你也可以使用简单的Python来完成这个操作。

数据

indices = [3, 5, 9, 13, 18]
my_list = list('abcdefghijklmnopqrstuvwxyz')

解决方法

使用列表推导式。

[(my_list+[''])[slice(ix,iy)] for ix, iy in zip([0]+indices, indices+[-1])]

输出结果

[['a', 'b', 'c'],
 ['d', 'e'],
 ['f', 'g', 'h', 'i'],
 ['j', 'k', 'l', 'm'],
 ['n', 'o', 'p', 'q', 'r'],
 ['s', 't', 'u', 'v', 'w', 'x', 'y', 'z']]

检查是否正确提取索引顺序

dict(((ix,iy), (my_list+[''])[slice(ix,iy)]) for ix, iy in zip([0]+indices, indices+[-1]))

输出

{(0, 3): ['a', 'b', 'c'],
 (3, 5): ['d', 'e'],
 (5, 9): ['f', 'g', 'h', 'i'],
 (9, 13): ['j', 'k', 'l', 'm'],
 (13, 18): ['n', 'o', 'p', 'q', 'r'],
 (18, -1): ['s', 't', 'u', 'v', 'w', 'x', 'y', 'z']}

我认为你的解决方案是不正确的,因为丢失了 z 字符。 - Leo77
@Leo77 谢谢你指出来。已经更新了解决方案。现在它应该也会给你 'z' 了。 - CypherX
  1. 你不需要使用切片,你可以只是使用my_list[ix : iy]
  2. 然后,在对列表进行切片时,可以使用None作为索引: my_list[ix:]my_list[ix: None] 是等价的。因此,你会得到类似这样的东西: [my_list[i: j] for i, j in zip([0] + indices, indices + [None])]
- Leo77

3

可以使用 itertools.zip_longest

[my_list[a:b] for a,b in it.zip_longest([0]+indices, indices)]

[['a', 'b', 'c'],
 ['d', 'e'],
 ['f', 'g', 'h', 'i'],
 ['j', 'k', 'l', 'm'],
 ['n', 'o', 'p', 'q', 'r'],
 ['s', 't', 'u', 'v', 'x', 'y', 'z']]

一些有趣的代码高尔夫比赛:
map(my_list.__getitem__, map(lambda s: slice(*s), it.zip_longest([0]+indices, indices)))

2

使用 itertools.teepairwise 的一种方法:

from itertools import tee

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

chunks = [my_list[i:j] for i, j in pairwise([0, *indices, len(my_list)])]
print(chunks)

输出:

[['a', 'b', 'c'],
 ['d', 'e'],
 ['f', 'g', 'h', 'i'],
 ['j', 'k', 'l', 'm'],
 ['n', 'o', 'p', 'q', 'r'],
 ['s', 't', 'u', 'v', 'w', 'x', 'y', 'z']]

如果可以使用numpy,请使用numpy.array_split,它专门用于此:

import numpy as np

np.array_split(my_list, indices)

输出:

[array(['a', 'b', 'c'], dtype='<U1'),
 array(['d', 'e'], dtype='<U1'),
 array(['f', 'g', 'h', 'i'], dtype='<U1'),
 array(['j', 'k', 'l', 'm'], dtype='<U1'),
 array(['n', 'o', 'p', 'q', 'r'], dtype='<U1'),
 array(['s', 't', 'u', 'v', 'w', 'x', 'y', 'z'], dtype='<U1')]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接