Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:返回列表中前n个元素的最大值_Python - Fatal编程技术网

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
,则无论大小,您的算法都需要两个步骤