在一个列表中,寻找长度有限制的最大值

4

我希望你能够从分块列表中找出最大的绝对值。

例如,给定以下列表:

[1, 2, 4, 5, 4, 5, 6, 7, 2, 6, -9, 6, 4, 2, 7, 8]

我想使用前瞻 = 4 找到最大值。对于这种情况,它将返回以下内容:
[5, 7, 9, 8]

如何使用Python简单地完成任务?

for d in data[::4]:
    if count < LIMIT:
        count = count + 1

        if abs(d) > maximum_item:
            maximum_item = abs(d)
    else:
        max_array.append(maximum_item)

        if maximum_item > highest_line:
            highest_line = maximum_item

        maximum_item = 0
        count = 1

我知道可以使用for循环来检查这个问题。但我相信在Python中有更简单的方法。

4个回答

5

使用标准的Python:

[max(abs(x) for x in arr[i:i+4]) for i in range(0, len(arr), 4)]

这也适用于数组无法被平均分割的情况。

如果数组不能被均匀分割怎么办? - moeseth
@AlexBelyaev - 对不起,没有提及你的评论。扩展的numpy解决方案(带填充)比这个标准的Python解决方案更长,并且需要更多的时间,所以我将其删除了。请现在删除你的JQuery评论。 - eumiro

4

list映射到abs(),然后list分块并发送到max()

array = [1,2,4,5,4,5,6,7,2,6,-9,6,4,2,7,8]
array = [abs(item) for item in array]
# use linked question's answer to chunk
# array = [[1,2,4,5], [4,5,6,7], [2,6,9,6], [4,2,7,8]] # chunked abs()'ed list
values = [max(item) for item in array]

结果:

>>> values
[5, 7, 9, 8]

OP是在尝试找出每个4个元素的最大值吗?...他所说的"lookahead = 4"是指这个意思吗?因为我没明白他的意思... - Iron Fist
我认为他们只是不知道该术语(他们现在已经将其编辑到问题中)。 - TigerhawkT3
回答使用numpy没问题,但是你的更有教育意义(感谢提供链接):) - Maxim Popravko

0

另一种方法是使用 itertools 模块中的 islice 方法:

>>> from itertools import islice
>>> [max(islice(map(abs,array),i,i+4)) for i in range(0,len(array),4)]
[5, 7, 9, 8]

简单来说:

1 - map(abs, array) 返回数组元素的绝对值列表
2 - islice(map(abs,array),i,i+4)) 将数组切片成四个元素一组的块
3 - i in range(0,len(array),4) 步进范围用于islice以避免重叠

这可以封装在函数中,如下所示:

def max_of_chunks(lst, chunk_size):
    lst = map(abs, lst)
    result = [max(islice(lst,i,i+chunk_size)) for i in range(0,len(lst),chunk_size)]
    return result

0

更新:哦,我刚看到任务和答案的最新评论。我没有正确理解任务,我的错 :) 让我的旧答案留在这里作为历史记录。你可以通过以下方式找到列表块中的最大数字:

largest = [max(abs(x) for x in l[i:i+n]) for i in xrange(0, len(l), n)]

或者

largest = [max(abs(x) for x in l[i:i+n]) for i in range(0, len(l), n)]

如果你正在使用Python3。


原始答案仅供历史参考:如果您需要从不是很大的列表中选择一些数字(仅一次),则不应该为此类简单任务安装像 numpy 这样的大型库。有许多使用内置Python工具完成它的技术。这里有一些(其中一些)。

所以我们有一些列表和最大不同元素的数量:

In [1]: l = [1, 2, 4, 5, 4, 5, 6, 7, 2, 6, -9, 6, 4, 2, 7, 8]
In [2]: n = 4

A. 首先,我们将源列表转换为集合,以获取唯一的数字。然后,我们创建一个由这些唯一数字组成的列表,对其进行排序,最后获取 N 个最后(最大)的元素:

In [3]: sorted(list(set(l)))[-n:]
Out[3]: [5, 6, 7, 8]

B. 你可以使用内置的 heapq 模块:

In [7]: import heapq

In [8]: heapq.nlargest(n, set(l))
Out[8]: [8, 7, 6, 5]

当然,你可以将A或B技术“包装”成一些人性化的函数,例如def get_largest(seq, n): return sorted(list(set(l)))[-n:]。是的,我省略了一些细节,比如处理IndexError。在编写代码时,您应该记住这一点。

C. 如果您的列表非常长,并且必须像Python一样快速执行许多此类操作,则应使用特殊的第三方库,例如numpybottleneck


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接