私は個人的にはvalues
以上のfor-loopを使用しますが、これはデータの上を1回通過するのでスペース効率が良いですが、読みにくい1ライナーを好む場合は常にreduce
:)
>>> import functools, itertools
>>> def max_tuple(t1, t2): return max(t1[0],t2[0]), max(t1[1],t2[1])
...
>>> ts = itertools.chain.from_iterable(roi.values())
>>> functools.reduce(max_tuple, ts)
(113, 1648)
メモ:スペース効率がよいことに注意してください。あなたはスピードを心配している場合は、ループを使用するか、または、あなたが還元作用のために、この代替実装試すことができます。私のために大幅に高速テストしてい
>>> def max_tuple2(t1, t2):
... (a,b), (x,y) = t1, t2
... return (a if a > x else x, b if b > y else y)
...
を、のは大きなテスト-dictのを作ってみよう:
>>> roi2 = {k+str(i): v*100 for k, v in roi.items() for i in range(100)}
そして今、いくつかのテスト:
>>> timeit.timeit('ts = itertools.chain.from_iterable(roi2.values()); functools.reduce(max_tuple, ts)', 'from __main__ import functools, itertools, max_tuple, roi2;', number=100)
4.612322789034806
>>> timeit.timeit('ts = itertools.chain.from_iterable(roi2.values()); functools.reduce(max_tuple2, ts)', 'from __main__ import functools, itertools, max_tuple2, roi2;', number=100)
1.7526514289784245
ので、よく二倍以上の速さmax_tuple2
を使用。しかし、速度が問題であれば、ナイーブなforloopアプローチを使用してください。ここで@AdiCのソリューションである、ビットを清書:
>>> def max_from_values(d):
... m1 = m2 = float('-inf')
... for tlist in d.values():
... for a, b in tlist:
... if a > m1:
... m1 = a
... if b > m2:
... m2 = b
... return m1, m2
...
>>> max_from_values(roi2)
(113, 1648)
そして、それがうまく三回最速以前よりも早く、元ののほぼ10倍高速オーバーで、見て:
>>> timeit.timeit('max_from_values(roi2)', 'from __main__ import max_from_values, roi2;', number=100)
0.4867470810422674
私は、辞書のすべての値をトラバースするという些細な解決策よりも優れた解決策はありません。 – GolfWolf