通过删除“中间”项从数组中删除条目的算法?

时间:2018-07-25 22:47:00

标签: python arrays algorithm

给出一个长度为n的商品列表,其中所需商品的最大数量为mm < n,并且该列表中最有价值的商品/距其他物品最远的物品很有用。如何从列表中删除项目以将列表的大小减小到m

  • 例如,对于[ a, b, c, d, e ]m == 2,我们将得到[ a, e]

  • 例如,对于[ a, b, c, d, e ]m == 3,我们将得到[ a, c, e ]

  • 例如,对于带有[ a, b, c, d, e ]的{​​{1}},我们将得到m == 4[ a, b, c, e ]。 (这两个答案都是有效的;但是只应返回一个,最好是确定性地返回。)

注意:我正在推广一个实际的问题,那就是从视频中选择代表性的帧。该代码将用python编写。

2 个答案:

答案 0 :(得分:2)

逐步浏览列表,步长约为(n-1)/(m-1),其中存在“大约”,因为我们不能使用非整数。

def representatives(l, m):
    num, den = len(l)-1, m-1
    return [l[i * num // den] for i in range(m)]

这里,结果的元素i取自输入的元素i*(n-1)//(m-1),其中//是底数划分。

答案 1 :(得分:2)

对于集合c

sparse_list = c[::len(c)//(m-1)]

这将返回步长为len(c)//(m-1)(请注意整数除法)的列表。

例如:

c = list(range(50))
m = 5
c[::len(c)//(m-1)] # [0, 12, 24, 36, 48]

它并不是很完美,因为它可以精确地间隔,但是它又快速又容易(而且性能出色)。