我正在寻找分块列表中的最大绝对值。
例如,列表是:
[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中有一种更简单的方法。
答案 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那样快速完成许多这些操作,你应该使用特殊的第三方库,如numpy
或bottleneck
。