2

私はこのリストを持っています:

dCF3v=[[(1.90689635276794, -44704.76171875)],
       [(1.90689635276794, -44705.76171875)],
       [(1.90689635276794, -44706.76171875)],
       [(1.90689635276794, -44707.76171875)]
      ]

各タプルの 2 番目の要素を比較して、絶対最大値を見つけたいと思います。

-44707.76171875

私のコードは次のようになります:

CF3=0
for x in dCF3v:
    if abs(x[1])>abs(CF3):
        CF3=x[1]
4

6 に答える 6

4

タプルを保持するリストを保持するリストがあります。したがって、おそらく必要ですabs(x[0][1])
次に、コマンドは次のようになります。

max(abs(x[0][1]) for x in dCF3v)

さらに言えば、おそらく実際にはデータ構造をタプルを保持するリストに変更したいでしょう:

dCF3v = [x[0] for x in dCF3v]

次に、次のようになります。

max(abs(x[0]) for x in dCF3v)

または、2 番目の要素だけでなくタプル全体を返す場合は、次のようにします。

max(dCF3v,key=lambda x:abs(x[0]))
于 2013-05-02T14:47:11.637 に答える
1

私の試みは、可能な限り高速で最も読みやすいバージョンを入手できるようにすることです. そうするために、私の提案は、最初に、必要な値を生成するジェネレーターを作成することです。そして、max()このジェネレーターで組み込み関数を実行します。これがより高速/より効率的である理由は、ジェネレーターを関数内に埋め込むこととほぼ同じです。Pythonmax()ではローカル変数のみを使用する方がグローバル変数を使用するよりも高速です。max()x[0][1]

vals = (abs(x[0][1]) for x in dCF3v)
print max(vals)

タイミング:

次のコードを使用して、私の回答とmgilsonsの回答の差を計りました。

import time
dCF3v = [[(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)]]

def method_inbar(l):
    vals = (abs(x[0][1]) for x in l)
    max(vals)

def method_mgilson(l):
    max(abs(x[0][1]) for x in l)

def timer(multiplier=[1,10,100,1000]):
    for m in multiplier:
        print "timing the speed using multiplier: %s" % m
        now = time.time()
        for i in range(100000):
            method_inbar(dCF3v*m)
        print "inbar's method: %r" % (time.time() - now)
        now = time.time()
        for i in range(100000):
            method_mgilson(dCF3v*m)
        print "mgilson's method: %r" % (time.time() - now)

timer()

これにより、より大きなデータ セットに対して毎回テストが実行されます。

>>> 
timing the speed using multiplier: 1
inbar's method: 0.18899989128112793
mgilson's method: 0.192000150680542
timing the speed using multiplier: 10
inbar's method: 0.8540000915527344
mgilson's method: 0.8229999542236328
timing the speed using multiplier: 100
inbar's method: 7.287999868392944
mgilson's method: 7.45199990272522
timing the speed using multiplier: 1000
inbar's method: 71.42099976539612
mgilson's method: 77.18499994277954

ご覧のとおり、大量のデータで。より高速です。遅い唯一の理由は、vals を開始するのに時間がかかるためです。関数を何度も何度も実行するため、はるかに遅いように見えますが、これを 1 回だけ実行している場合は、小さなデータ セットでは違いを感じないはずです。ですが、大規模なデータセットでは大きな違いを感じるはずです。(わずか1000回で数秒)

于 2013-05-02T15:02:10.303 に答える
1

単純に

dCF3v=[[(1.90689635276794, -44706.76171875)],
       [(1.90689635276794, -44706.76171875)],
       [(1.90689635276794, -44706.76171875)],
       [(1.90689635276794, -44706.76171875)]
      ]

M = max([x[0][1] for x in dCF3v])
于 2013-05-02T15:03:05.690 に答える