Lea*_*ava 0 python max min python-2.7
列表:
RawScores = [3.4,1.2,5.8,7.2,2.8,9.1,7.6,4]
Run Code Online (Sandbox Code Playgroud)
目前我正在使用以下方法从列表中删除最高和最低数字:
RawScores.remove(max(RawScores))
RawScores.remove(min(RawScores))
Run Code Online (Sandbox Code Playgroud)
我想知道是否有替代或更有效的方法产生相同的结果,但只能在一行代码上实现.
这可能看起来微不足道,但您可以将两个语句放在同一行:
RawScores.remove(max(RawScores)); RawScores.remove(min(RawScores))
Run Code Online (Sandbox Code Playgroud)
您可以在不必先复制列表的情况下修改列表.
就性能而言,这就是目前提出的方法比较的方法(在较长的列表上使差异更明显):
def a():
RawScores = [3.4,1.2,5.8,7.2,2.8,9.1,7.6,4] * 100
RawScores.remove(max(RawScores)), RawScores.remove(min(RawScores))
def b():
RawScores = [3.4,1.2,5.8,7.2,2.8,9.1,7.6,4] * 100
RawScores = [x for x in RawScores if x != max(RawScores) and x != min(RawScores)]
def c():
RawScores = [3.4,1.2,5.8,7.2,2.8,9.1,7.6,4] * 100
RawScores = sorted(RawScores)[1:-1]
%timeit a() # 10000 loops, best of 3: 66.3 µs per loop
%timeit b() # 10 loops, best of 3: 49.3 ms per loop
%timeit c() # 1000 loops, best of 3: 212 µs per loop
Run Code Online (Sandbox Code Playgroud)
到目前为止,最初的解决方案是最快的.
请不要太认真地对待我的回答.像这样在一行上放多个语句是一种可怕的做法.Python代码应该很漂亮而不是内联:)
更新:我在另一台计算机上运行此程序,包括两种filter解决方案:
def d():
RawScores = [3.4,1.2,5.8,7.2,2.8,9.1,7.6,4] * 100
RawScores = list(filter(lambda value: (value != max(RawScores) and value != min(RawScores)), RawScores))
def e():
RawScores = [3.4,1.2,5.8,7.2,2.8,9.1,7.6,4] * 100
RawScores = list(filter(lambda value, ma=max(RawScores), mi=min(RawScores): (value != ma and value != mi), RawScores))
%timeit a() # 115 µs ± 3.13 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit b() # 80 ms ± 1.49 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit c() # 377 µs ± 777 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit d() # 78.7 ms ± 94.8 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit e() # 458 µs ± 22.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)
显然,只计算一次min和max而不是每个元素都是有意义的.仍然,就地删除是最快的.