python:返回列表中前n个元素的最大值
我有一个列表,需要在列表python:返回列表中前n个元素的最大值,python,Python,我有一个列表,需要在列表a中找到两个列表,分别跟踪最大值/最小值 在某些包或numpy中是否有不需要循环的函数?我需要加快我的代码,因为我的数据集是巨大的 a=[4,2,6,5,2,6,9,7,10,1,2,1] b=[];c=[]; for i in range(len(a)): if i==0: b.append(a[i]) elif a[i]>b[-1]: b.append(a[i]) for i in range(len(a)):
a
中找到两个列表,分别跟踪最大值/最小值
在某些包或numpy
中是否有不需要循环的函数?我需要加快我的代码,因为我的数据集是巨大的
a=[4,2,6,5,2,6,9,7,10,1,2,1]
b=[];c=[];
for i in range(len(a)):
if i==0:
b.append(a[i])
elif a[i]>b[-1]:
b.append(a[i])
for i in range(len(a)):
if i==0:
c.append(a[i])
elif a[i]<c[-1]:
c.append(a[i])
#The output should be a list :
b=[4,6,9,10];c=[4,2,1]
a=[4,2,6,5,2,6,9,7,10,1,2,1]
b=[];c=[];
对于范围内的i(len(a)):
如果i==0:
b、 附加(a[i])
如果a[i]>b[-1]:
b、 附加(a[i])
对于范围内的i(len(a)):
如果i==0:
c、 附加(a[i])
如果a[i]要启动,只需使用a
的第一个元素初始化b
和c
。这简化了循环(您只需要1个循环):
首先,您只需使用a
的第一个元素初始化b
和c
。这简化了循环(您只需要1个循环):
因为您说您正在处理一个非常大的数据集,并且希望避免使用循环,所以这可能是一个潜在的解决方案,它可以将循环保持在最小值:
def while_loop(a):
b = [a[0]]
c = [a[0]]
a = np.array(a[1:])
while a.size:
if a[0] > b[-1]:
b.append(a[0])
elif a[0] < c[-1]:
c.append(a[0])
a = a[(a > b[-1]) | (a < c[-1])]
return b, c
def while_循环(a):
b=[a[0]]
c=[a[0]]
a=np.array(a[1:]
而a.尺寸:
如果a[0]>b[-1]:
b、 追加(a[0])
如果a[0]b[-1])|(a
编辑:
def for_loop(a):
b = [a[0]]
c = [a[0]]
for x in a[1:]:
if x > b[-1]:
b.append(x)
elif x < c[-1]:
c.append(x)
return b, c
print(
timeit(lambda: while_loop(np.random.randint(0, 10000, 10000)), number=100000)
) # 27.847886939000002
print(
timeit(lambda: for_loop(np.random.randint(0, 10000, 10000)), number=100000)
) # 112.90950811199998
def for_循环(a):
b=[a[0]]
c=[a[0]]
对于[1:]中的x:
如果x>b[-1]:
b、 附加(x)
elif x
好的,我刚刚检查了常规for循环的计时,while循环似乎快了4-5倍。但不能保证,因为这在很大程度上取决于数据集的结构(请参见注释)。因为您说您正在处理一个非常大的数据集,并且希望避免使用循环,所以这可能是一个潜在的解决方案,它可以将循环保持在最低限度:
def while_loop(a):
b = [a[0]]
c = [a[0]]
a = np.array(a[1:])
while a.size:
if a[0] > b[-1]:
b.append(a[0])
elif a[0] < c[-1]:
c.append(a[0])
a = a[(a > b[-1]) | (a < c[-1])]
return b, c
def while_循环(a):
b=[a[0]]
c=[a[0]]
a=np.array(a[1:]
而a.尺寸:
如果a[0]>b[-1]:
b、 追加(a[0])
如果a[0]b[-1])|(a
编辑:
def for_loop(a):
b = [a[0]]
c = [a[0]]
for x in a[1:]:
if x > b[-1]:
b.append(x)
elif x < c[-1]:
c.append(x)
return b, c
print(
timeit(lambda: while_loop(np.random.randint(0, 10000, 10000)), number=100000)
) # 27.847886939000002
print(
timeit(lambda: for_loop(np.random.randint(0, 10000, 10000)), number=100000)
) # 112.90950811199998
def for_循环(a):
b=[a[0]]
c=[a[0]]
对于[1:]中的x:
如果x>b[-1]:
b、 附加(x)
elif x
好的,我刚刚检查了常规for循环的计时,while循环似乎快了4-5倍。但不能保证,因为这在很大程度上取决于数据集的结构(参见注释)。不太了解这两个列表是什么,请澄清。要在列表中查找最大值,您可以使用标准的max()
或numpy.max
在numpy中查找问题的标题与您要查找的输出不匹配,这有点令人困惑。您可以使用max()
和切片来查找列表部分的最大值。i、 e.max(a[:5])
将找到a的前五个元素中的最大值。预期输出看起来像是min和maxes的累进集合。例如,4
是在看到6之前的最大值,在看到9之前的最大值,等等。您是否在初始列表(a
)中寻找升序(b
)和降序(c
)值?不太了解这两个列表是什么,请澄清。要在列表中查找最大值,您可以使用标准的max()
或numpy.max
在numpy中查找问题的标题与您要查找的输出不匹配,这有点令人困惑。您可以使用max()
和切片来查找列表部分的最大值。i、 e.max(a[:5])
将找到a的前五个元素中的最大值。预期输出看起来像是min和maxes的累进集合。例如,4
是在看到6之前的最大值,在看到9之前的最大值,等等。您是否在寻找初始列表(a
)中的升序(b
)和降序(c
)值?我怀疑在大多数情况下(即a
与[5,4,6,3,7,2,8,1]
,在新的分钟和新的最大值之间交替)。谢谢@chepner,说得好!我对性能不是很确定,因为我还没有真正感觉到某些操作有多么昂贵,我只是想到了尽可能多地消除循环。也许其他人可以改进我的方法。我怀疑这对于非常大的输入来说是更快的。这是我的想法s O(n^2),而对于
-循环的单次扫描是O(n)。而a.size:
是O(n),嵌套的a=a[(a>b[-1])|(a
对于总的O(n^2)也是O(n)这种方法只有当每个掩码消除了很多项目时才有优势,这得益于NUMPY数组的原始性能优势。但是根据数据,这可能是一个合理的假设。是的,对于随机数,这应该相当好。如果您从In中提取<代码> N< /代码>数字,请考虑一下。terval[0,n
),第一个数字大于以下项目的50%的可能性为50%。如果项目数量大于项目范围,这也将是一个优势(例如,如果只有数字0
和1
,则无论大小,您的算法都需要两个步骤