1

これらのインデックスを区別するために、いくつかの非常に大きな値を意図的に設定したリストがあります。次のようになります。

a = [1.3, 2.1, 9999., 5., 3.7 ,6.6, 9999., 7.4, 9999., 3.5, 7, 1.2, 9999.]

可能な限り最も効率的な方法で、そのリストで 2 番目に大きい値を見つける必要があります(上記9999.の場合は になります7.4) (私のリストは非常に大きくなる可能性があります)。

この質問では、100,000 個の整数を含むリストから 2 つの最も高い項目を取得する関数heapq.nlargestについて言及されていますが、複数の値があるため、機能9999.しません。

4

4 に答える 4

5

別の方法を次に示します。

>>> a = [1.3, 2.1, 9999., 5., 3.7 ,6.6, 9999., 7.4, 9999., 3.5, 7, 1.2, 9999.]
>>> sorted(set(a))[-2]
7.4
>>>

そして、信じられないかもしれませんが、実際には、受け入れられているソリューションよりもはるかに高速です。

>>> from timeit import timeit
>>> timeit("a=range(10000000);print sorted(set(a))[-2]", number=10)
9999998
9999998
9999998
9999998
9999998
9999998
9999998
9999998
9999998
9999998
34.327036257401424
>>> # This is NPE's answer
>>> timeit("a=range(10000000);maxa = max(a);print max(val for val in a if val != maxa)", number=10)
9999998
9999998
9999998
9999998
9999998
9999998
9999998
9999998
9999998
9999998
53.22811809880869
>>>

上記は、10 回実行され、10,000,000 項目を含むリストで機能するテストです。私のテストに欠陥がない限り (存在するとは思わない)、私が提供したソリューションは明らかにはるかに高速です。

于 2013-10-16T20:35:53.547 に答える
2
a = set([1.3, 2.1, 9999., 5., 3.7 ,6.6, 9999., 7.4, 9999., 3.5, 7, 1.2, 9999.])
a.remove(max(a))
print max(a)

これを使用setして、一意のアイテムのみを処理し、最大値を削除して、次に を呼び出すときにmax2 番目に最適な最大値が残るようにします。

于 2013-10-16T20:11:34.277 に答える
0

numpy を使用する場合は、マスクされた配列を使用して「悪い」値をスキップできます。

import numpy as np
a = np.array([1.3, 2.1, 9999., 5., 3.7 ,6.6, 9999., 7.4, 9999., 3.5, 7, 1.2, 9999.])
ma = np.ma.masked_values(a, 9999., copy=False)
ma.max()
7.4

マスクに除外を簡単に追加できます。

ma = np.ma.masked_values(ma, 7.4, copy=False)
ma.max()
7.0
ma.mask[ma>=5]=True   
ma.max()
3.7
于 2013-10-16T23:07:32.637 に答える