【发布时间】:2020-06-05 12:07:02
【问题描述】:
给定这个排序数组:
>>> 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']作为第二组。
我也玩过夹住切片。
首先我defined a clamp function是这样的:
>>> 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 文章,但它们没有解决这些极端情况:
Search a list for item(s)and return x number of surrounding items in python
efficient way to find several rows above and below a subset of data
【问题讨论】:
-
你在寻找这样的东西吗
[x[i-2:i+3] for i in range(2, len(x) - 2)]另外为什么不在主题之后做 4 个元素呢?[x[i:i+5] for i in range(len(x) - 4)]
标签: python