在列表中查找有限长度的最大值

时间:2015-12-31 08:35:34

标签: python list

我正在寻找分块列表中的最大绝对值。

例如,列表是:

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

我想通过lookahead = 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 个答案:

答案 0 :(得分:5)

使用标准Python:

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

如果阵列无法均匀分割,也可以使用。

答案 1 :(得分:4)

list映射到abs(),然后chunk the 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]

答案 2 :(得分: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

答案 3 :(得分: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