当前位置: 首页 > 面试题库 >

将Python列表拆分为重叠块的列表

许俊贤
2023-03-14
问题内容

这个问题类似于将 列表切成子列表的列表
,但是在我的情况下,我想包括每个先前子列表的最后一个元素,作为下一个子列表的第一个元素。并且必须考虑到最后一个元素必须始终至少包含两个元素。

例如:

list_ = ['a','b','c','d','e','f','g','h']

大小为3的子列表的结果:

resultant_list = [['a','b','c'],['c','d','e'],['e','f','g'],['g','h']]

问题答案:

通过简单地缩短传递到范围的“
step”参数,可以轻松地将链接的答案中的列表理解用于支持重叠的块:

>>> list_ = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> n = 3  # group size
>>> m = 1  # overlap size
>>> [list_[i:i+n] for i in range(0, len(list_), n-m)]
[['a', 'b', 'c'], ['c', 'd', 'e'], ['e', 'f', 'g'], ['g', 'h']]

这个问题的其他访问者可能没有足够的精力来处理输入 列表 (可分割,已知长度,有限)。这是一个基于生成器的解决方案,可以与任意可迭代对象一起使用:

from collections import deque

def chunks(iterable, chunk_size=3, overlap=0):
    # we'll use a deque to hold the values because it automatically
    # discards any extraneous elements if it grows too large
    if chunk_size < 1:
        raise Exception("chunk size too small")
    if overlap >= chunk_size:
        raise Exception("overlap too large")
    queue = deque(maxlen=chunk_size)
    it = iter(iterable)
    i = 0
    try:
        # start by filling the queue with the first group
        for i in range(chunk_size):
            queue.append(next(it))
        while True:
            yield tuple(queue)
            # after yielding a chunk, get enough elements for the next chunk
            for i in range(chunk_size - overlap):
                queue.append(next(it))
    except StopIteration:
        # if the iterator is exhausted, yield any remaining elements
        i += overlap
        if i > 0:
            yield tuple(queue)[-i:]

注意:
此后,我已经在中发布了此实现wimpy.util.chunks。如果您不介意添加依赖项,则可以pip install wimpy并且可以使用from wimpy import chunks而不是复制粘贴代码。



 类似资料:
  • 我有一个对象(Pos)与此模型的集合: 对象列表如下所示: 我想按beforeChangement或afterChangement==”字段拆分此对象列表要使用此格式(列表列表)

  • 我有一个Pandas DataFrame列,其中包含一个列表中的多个列表。类似于这样: 我想将列表拆分为多列,因此输出应该是这样的: 请帮我做这件事。预先感谢

  • 如何将这列列表拆分为两列? 期望的结果:

  • 问题内容: 如果我们在python中有一个,并且想要基于一些特殊的条件创建子列表,我们应该怎么做? 例如: 会产生: 问题答案: itertools.groupby是一种方法(通常是这样): 由于这种特殊情况,我们甚至可以作弊:

  • 问题内容: 我需要提取给定窗口的时间序列/数组的所有子序列。例如: 迭代序列的简单方法当然很昂贵,例如: 我发现了一种更好的方法,即复制序列,将其移动一个不同的值直到覆盖窗口,然后使用分割不同的序列。性能大约提高了100倍,因为for循环遍历窗口大小而不是序列大小: 我已经看到pandas在pandas.stats.moment模块中包含多个滚动功能,我想它们的作用在某种程度上类似于子序列问题。该

  • 问题内容: 我将数据保存在postgreSQL数据库中。我正在使用Python2.7查询此数据并将其转换为Pandas DataFrame。但是,此数据框的最后一列中包含值的字典(或列表?)。DataFrame看起来像这样: 我需要将此列拆分为单独的列,以便DataFrame如下所示: 我遇到的主要问题是列表的长度不同。但是所有列表最多只能包含相同的3个值:a,b和c。而且它们始终以相同的顺序出现