1

私には口述があります、

d = {'a': [4,'Adam', 2], 'b': [3,'John', 4], 'c': [4,'Adam', 3], 'd': [4,'Bill', 3], 'e': [4,'Bob'], 'f': [4, 'Joe'], 'g': [4, 'Bill']}

辞書の各リストの数値の合計を取得する簡単な方法はありますか?

たとえば、aを返す必要があり6、を返す必要があります。b7

現在、私はこれを行っています。

for i in d:
    l2=[]
    for thing in d[i]:
        if type(thing) == int:
            l2.append(thing)
        print sum(l2)

毎回調べて番号をリストに追加するよりも迅速な修正が可能ですか?

ありがとう!

4

4 に答える 4

8

辞書内包表記を使用したかなり簡単な方法は次のとおりです。

sums = {k: sum(i for i in v if isinstance(i, int)) for k, v in d.items()}

またはPython2.6以下の場合:

sums = dict((k, sum(i for i in v if isinstance(i, int))) for k, v in d.items())

例:

>>> {k: sum(i for i in v if isinstance(i, int)) for k, v in d.items()}
{'a': 6, 'c': 7, 'b': 7, 'e': 4, 'd': 7, 'g': 4, 'f': 4}
于 2012-08-14T00:14:46.527 に答える
0

この場合、番号はすべてリストの1番目と3番目の位置にあるためです。

>>> {k: sum(v[::2]) for k,v in d.items()}
{'a': 6, 'c': 7, 'b': 7, 'e': 4, 'd': 7, 'g': 4, 'f': 4}
于 2012-08-14T00:19:17.557 に答える
0

リストとして出力する場合は、リスト内包表記を使用します。

d = {'a': [4,'Adam', 2], 'b': [3,'John', 4], 'c': [4,'Adam', 3], 'd': [4,'Bill',
3], 'e': [4,'Bob'], 'f': [4, 'Joe'], 'g': [4, 'Bill']}

sums = [sum(i for i in v if isinstance(i, int)) for k, v in d.items()]

[6, 7, 7, 4, 7, 4, 4]

ご覧のとおり、これは完全には一致していません。dにアイテムを手動で追加すると

[6, 7, 7, 7, 4, 4, 4]

では、なぜ不一致なのですか?

辞書が分類されていないからです

dを辞書として作成するとすぐにその項目が再配置されるため、そのようなリスト内包表記を出力すると正しい合計が得られますが、どの合計がどの辞書項目に対応するかはわかりません。

これが、FJの辞書理解の提案がここで最良の選択肢であると思われる理由です。

あなたがそれがどういうわけかリスト内包で実行可能であるのを見ない限り?

于 2012-08-14T01:30:44.567 に答える
0

辞書にfloat値がある場合、上記のコードは機能しません。0値として出力されます。

したがって、整数と浮動小数点数を処理するには、以下のコードを使用できます。

理解の仕方で、

sums = {k: sum(i for i in v if not isinstance(i, str)) for k, v in d.items()}

また

共通関数を使用して、指定された入力が数値であるかどうかを確認してから、値を合計できます。

d = {'a': [4,'Adam', 2], 'b': [3,'John', 4], 'c': [4,'Adam', 3], 'd': [4,'Bill', 3], 'e': [4,'Bob'], 'f': [4, 'Joe'], 'g': [4, 'Bill']}


def get_num(str):
    """ 
        This function converts the number/number string into a float. Otherwise, returns 0        
     """
    try:
        return float(str)
    except:
        return 0.0

if __name__ == '__main__':
    # example list which contains numbers and strings
    sums = {k:sum(get_num(value) for value in v) for k, v in d.items()}
    print sums
    ## output for the given input dict d
    ## {'a': 6.0, 'c': 7.0, 'b': 7.0, 'e': 4.0, 'd': 7.0, 'g': 4.0, 'f': 4.0}
于 2014-01-07T08:12:00.520 に答える