给出一个长度为n
的商品列表,其中所需商品的最大数量为m
和m < 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编写。
答案 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]
它并不是很完美,因为它可以精确地间隔,但是它又快速又容易(而且性能出色)。