4

辞書で最も頻度の低い値を返すように要求する問題に取り組んでいますが、いくつかの異なるカウント以外では解決できないようですが、辞書には設定された数の値がありませんチェックで提供されます。

たとえば、ディクショナリに生徒の名前 (文字列) から年齢 (整数) へのマッピングが含まれているとします。このメソッドは、発生頻度が最も低い年齢を返します。次のキーと値のペアを含む辞書変数 d を考えてみましょう。

{'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'ステフ:22}

3 人は 20 歳 (Jeff、Kasey、Kim)、2 人は 22 歳 (Alyssa と Stef)、4 人は 25 歳 (Char、Dan、Mogran、Ryan) です。その年齢は 2 人だけなので、raest(d) は 22 を返します。

誰か私を正しい方向に向けてくれませんか?ありがとう!

4

7 に答える 7

10

コレクションのメンバーを数えるのは次の仕事ですcollections.Counter:

d={'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22}
import collections
print collections.Counter(d.values()).most_common()[-1][0]
22
于 2013-11-14T17:41:14.123 に答える
1

カウンターの空の dict を作成し、取得した dict をループして、2 番目の dict の対応する値に 1 を追加し、2 番目の dict の最小値を持つ要素のキーを返すことができます。

于 2013-11-14T17:38:34.537 に答える
1

使用できますcollections.Counter

d={'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22}
import collections
print collections.Counter(d.values()).most_common()[-1][0]

または、独自の関数を作成します。

def rarest(dict):
    values = dict.values()
    least_frequent = max(values)
    for x in set(values):
        if values.count(x) < least_frequent:
            least_frequent = x
    return {least_frequent:dict[least_frequent]}

>>> rarest({'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22})
{22:2}
于 2013-11-14T17:56:57.317 に答える
0

最初の値 (年齢) を 2 番目のキーとして使用し、2 番目の値をカウントとして使用する 2 番目の辞書を作成できます。次に、秒の値をソートし、逆のループアップを実行して関連するキーを取得します (キーのリストと値のリストを numpy 配列として扱うことにより、これを効率的に行う方法がいくつかあります)。

import numpy

d = {'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22}

def rarest(d):
    s = {}

    # First, map ages to counts.
    for key in d:
        if d[key] not in s:
            s[d[key]] = 1
        else:
            s[d[key]] += 1 # Could use a defaultdict for this.

    # Second, sort on the counts to find the rarest.
    keys = numpy.array(s.keys())
    values = numpy.array(s.values())
    ordering = np.argsort(values)
    return keys[ordering][0]

おそらくこれを行うためのより効率的な方法がありますが、それはうまくいくようです。

于 2013-11-14T17:37:43.387 に答える
0
my_dict = {'Alyssa':22, 'Char':25, 'Dan':25, 'Jeff':20, 'Kasey':20, 'Kim':20, 'Mogran':25, 'Ryan':25, 'Stef':22}
values = my_dict.values()
most_frequent = 0
for x in set(values):
    if values.count(x) > most_frequent:
        most_frequent = x
print most_frequent

このコードは、set()すべての一意の要素を含むセットを返すメソッドを使用します。つまり:

>> set([1, 2, 3, 4, 2, 1])
set([1, 2, 3, 4])

dict からすべての値を抽出するには、 を使用できますdict.values()。同様に、 と がdict.keys()ありdict.items()ます。

>> my_dict.keys()
['Char', 'Stef', 'Kim', 'Jeff', 'Kasey', 'Dan', 'Mogran', 'Alyssa', 'Ryan']

>> my_dict.values()
[25, 22, 20, 20, 20, 25, 25, 22, 25]

>> my_dict.items()
[('Char', 25),
 ('Stef', 22),
 ('Kim', 20),
 ('Jeff', 20),
 ('Kasey', 20),
 ('Dan', 25),
 ('Mogran', 25),
 ('Alyssa', 22),
 ('Ryan', 25)]
于 2013-11-14T17:46:16.347 に答える