2

スコアを計算するためのリストと関数がある場合、次のように argmax を計算できます。

maxscore = 0; argmax = None
x = [3.49, 0.122, 293, 0.98] # Imagine a LARGE list.
for i in x:
    # Maybe there're some other func() to calculate score
    # For now just sum the digits in i.
    score = sum([int(j) for j in str(i) if j.isdigit()])
    print i, score
    if maxscore < score:
        maxscore = score
        argmax = i

argmax を達成する他の方法はありますか? そうするためのpythonicの方法は何ですか?

4

2 に答える 2

8
def score(i):
    return sum([int(j) for j in str(i) if j.isdigit()])

max(x, key=score)
于 2014-01-29T02:20:35.980 に答える
0

非 Unicode 文字列の大きなリストに対してこれを何度も行う場合は、セットアップの 1 回限りのオーバーヘッドに見合うだけの価値があるかもしれません。そのため、可能な限り多くのプロセスを比較的単純なテーブル ルックアップとC で記述された組み込みメソッド ( string_translate()CPython と同様):

x = [3.49, 0.122, 293, 0.98]

digits = set(range(ord('0'), ord('9')+1))
transtable = ''.join(chr(i-ord('0')) if i in digits else chr(0)
                        for i in range(256))
deletechars = ''.join(chr(i) for i in range(256) if i not in digits)

def sum_digit_chars(i):
    return sum(bytearray(str(i).translate(transtable, deletechars)))

print max(x, key=sum_digit_chars)
于 2014-01-29T03:47:18.517 に答える