开发者社区> 问答> 正文

切片列表,使结果在主题之前有2个元素,在主题之后有2个元素,并且结果长度恒定?

给定此排序数组:

>>> x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']

我想切成这个数组,以便总是有5个元素。上面2个和下面2个。我去了:

>>> [x[i-2:i+2] for i, v in enumerate(x)]

结果是:

[[], [], ['a', 'b', 'c', 'd'], ['b', 'c', 'd', 'e'], ['c', 'd', 'e', 'f'], ['d', 'e', 'f', 'g'], ['e', 'f', 'g', 'h'], ['f', 'g', 'h', 'i'], ['g', 'h', 'i', 'j'], ['h', 'i', 'j', 'k'], ['i', 'j', 'k', 'l'], ['j', 'k', 'l']]

问题是:

每组有4个元素,而不是5个 并非每个组都有2个以上和2个以下。 第一组和最后一组是特殊情况。我不要在前面空白。我想看到的是['a', 'b', 'c', 'd', 'e']第一组,然后['b', 'c', 'd', 'e', 'f'] 是第二组。 我还玩弄夹片。

首先,我定义了一个钳位函数,如下所示:

>>> def clamp(n, smallest, largest): return max(smallest, min(n, largest))

然后,我像这样应用了该函数:

[x[clamp(i-2, 0, i):clamp(i+2, i, len(x))] for i, v in enumerate(x)] 但这并不能很好地解决:

[['a', 'b'], ['a', 'b', 'c'], ['a', 'b', 'c', 'd'], ['b', 'c', 'd', 'e'], ['c', 'd', 'e', 'f'], ['d', 'e', 'f', 'g'], ['e', 'f', 'g', 'h'], ['f', 'g', 'h', 'i'], ['g', 'h', 'i', 'j'], ['h', 'i', 'j', 'k'], ['i', 'j', 'k', 'l'], ['j', 'k', 'l']]

我什至还在吠叫正确的树吗?

我找到了两篇有关此问题的SO文章,但它们没有解决这些极端情况:

展开
收起
祖安文状元 2020-02-21 14:08:27 348 0
1 条回答
写回答
取消 提交回答
  • 一些观察:

    您可能要使用range(len(x))而不是枚举,那么您将不必解压结果。

    如果有人需要了解切片符号,这可能会有所帮助

    然后,您可以过滤理解中的列表

    x = list('abcdefghijklmno')
    [ x[i-2:i+2+1] for i in range(len(x)) if len(x[i-2:i+2+1]) == 5 ]
    # [['a', 'b', 'c', 'd', 'e'], ['b', 'c', 'd', 'e', 'f'], ['c', 'd', 'e', 'f', 'g'], ['d', 'e', 'f', 'g', 'h'], ['e', 'f', 'g', 'h', 'i'], ['f', 'g', 'h', 'i', 'j'], ['g', 'h', 'i', 'j', 'k'], ['h', 'i', 'j', 'k', 'l'], ['i', 'j', 'k', 'l', 'm'], ['j', 'k', 'l', '`
    # On python 3.8 you can use the walrus operator!!!
    [ y for i in range(len(x)) if len(y:=x[i-2:i+2+1]) == 5 ]
    # [['a', 'b', 'c', 'd', 'e'], ['b', 'c', 'd', 'e', 'f'], ['c', 'd', 'e', 'f', 'g'], ['d', 'e', 'f', 'g', 'h'], ['e', 'f', 'g', 'h', 'i'], ['f', 'g', 'h', 'i', 'j'], ['g', 'h', 'i', 'j', 'k'], ['h', 'i', 'j', 'k', 'l'], ['i', 'j', 'k', 'l', 'm'], ['j', 'k', 'l', 'm', 'n'], ['k', 'l', 'm', 'n', 'o']]
    
    2020-02-21 14:08:50
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载