web-dev-qa-db-ja.com

Pythonのmaxを使用して2つの同じ大きさの値を返す

私はPythonの max 関数を使用して、countという辞書で最大の整数と、対応するキーを見つけています(正しく言っているかどうかはわかりませんが、私のコードはおそらく説明しています私が説明しているよりもそれ自体が優れています)。辞書count{'a': 100, 'b': 210}の行に沿っています。

number = count[max(count.items(), key=operator.itemgetter(1))[0]]
highest = max(count, key=count.get)

そこに2つの等しい最大値がある場合はどうすればよいですか? {'a': 120, 'b': 120, 'c': 100}がある場合、これはabの両方ではなく、最初のものだけを見つけます。

17
kidosu

アスタリスクと同じアイデアですが、リストを2回繰り返す必要はありません。もう少し冗長です。

count = { 'a': 120, 'b': 120, 'c': 100 }
answers = []
highest = -1

def f(x):
    global highest, answers
    if count[x] > highest:
        highest = count[x]
        answers = [x]
    Elif count[x] == highest:
        answers.append(x)

map(f, count.keys())
print answers
2
Jos Kraaijeveld

高速シングルパス:

a = { 'a': 120, 'b': 120, 'c': 100 }
z = [0]
while a:
    key, value = a.popitem()
    if value > z[0]:
        z = [value,[key]]
    Elif value == z[0]:
        z[1].append(key)

print z
#output:
[120, ['a', 'b']]

そして defualtdict の面白い方法:

import collections
b = collections.defaultdict(list)
for key, value in a.iteritems():
    b[value].append(key)
print max(b.items())
#output:
(120, ['a', 'b'])
1
fraxel

バケットなしでリストを印刷します。使用する :

' '.join(map(str, mylist))

または、より詳細に:

' '.join(str(x) for x in mylist)
0
Ray

最も単純な解決策が最善の場合もあります。

max_value = 0
max_keys = []

for k, v in count.items():
    if v >= max_value:
        if v > max_value:
            max_value = v
            max_keys = [k]
        else:
            max_keys.append(k)

print max_keys

上記のコードは、次のような2パスソリューションよりもわずかに高速です。

highest = max(count.values())
print [k for k,v in count.items() if v == highest]

もちろんもっと長いですが、その一方で、それは非常に明確で読みやすいです。

0
Tupteq

これは方法かもしれません(おそらく最も効率的ではありません)。

value = max(count.values())
filter(lambda key: count[key]==value,count)
0
luke14free