0

私はこの問題を適切に定式化する方法に固執しており、以下は次のとおりです。

次の値がある場合はどうなりますか。

{('A','B','C','D'):3, 
('A','C','B','D'):2,
('B','D','C','A'):4,
('D','C','B','A'):3,
('C','B','A','D'):1,
('C','D','A','B'):1}

1位の値を合計すると:[5,4,2,3](5人が最初にAを選び、4人が最初にBを選んだ、というようにA = 5、B = 4、C = 2、D = 3)

アルファベットの最大値は5で、過半数ではありません(5/14は半分未満です)。ここで、14は合計値の合計です。

そのため、1位のピックが最も少ないアルファベットを削除します。この場合はCです。

{'A':5, 'B':4, 'C':2, 'D':3} 何もインポートせずに辞書を返したい。

これは私の仕事です:

def popular(letter):
    '''(dict of {tuple of (str, str, str, str): int}) -> dict of {str:int}
    '''
    my_dictionary = {}
    counter = 0

    for (alphabet, picks) in letter.items():
        if (alphabet[0]):
            my_dictionary[alphabet[0]] = picks
        else:
            my_dictionary[alphabet[0]] = counter

    return my_dictionary

これは、私が取り除くことができないキーの重複を返します。

ありがとう。

4

1 に答える 1

0

以下が機能するはずです。

def popular(letter):
    '''(dict of {tuple of (str, str, str, str): int}) -> dict of {str:int}
    '''
    my_dictionary = {}
    for alphabet, picks in letter.items():
        if alphabet[0] in my_dictionary:
            my_dictionary[alphabet[0]] += picks
        else:
            my_dictionary[alphabet[0]] = picks
    return my_dictionary

例:

>>> letter = {('A','B','C','D'):3, 
... ('A','C','B','D'):2,
... ('B','D','C','A'):4,
... ('D','C','B','A'):3,
... ('C','B','A','D'):1,
... ('C','D','A','B'):1}
>>> popular(letter)
{'A': 5, 'C': 2, 'B': 4, 'D': 3}

これは、 collections.defaultdictを使用してより簡潔に実行できます。

from collections import defaultdict
def popular(letter):
    my_dictionary = defaultdict(int)
    for alphabet, picks in letter.items():
        my_dictionary[alphabet[0]] += picks
    return dict(my_dictionary)
于 2012-11-26T23:07:05.147 に答える