亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對任意多個字典和數字進行數學運算

對任意多個字典和數字進行數學運算

牧羊人nacy 2022-06-02 17:50:54
我想做以下事情:采用任意數量的字典或數字參數作為字典的參數,檢查它們是否都具有相同的鍵(否則錯誤)做類似的事情    for key in dict:             out[key] = product(dict1[key],number2,dict2[key],etc.)如果一個參數是一個數字,它假裝“好像”它是一個字典,該數字作為每個鍵的值。(當然,這也可以sum代替product)。理想情況下,這將是一個庫,但我可以使用手寫函數。到目前為止,我還沒有寫出任何適用于兩個以上論點的東西。例如,假設我的輸入是:a = {    'Burkina' : 100,    'Chad': 50}b = 2對于兩個論點,我認為這有效:def p(a,b):    out = {}    try:        for key in a:            try:                out[key] = a[key]*b[key]            except TypeError:                out[key] = a[key]*b    except TypeError:        for key in b:            try:                out[key] = a[key]*b[key]            except TypeError:                out[key] = a*b[key]    for key in out:        print(key,out[key])但是這種方法需要一個越來越長的函數來處理更多的參數。所以這不可能。然后我嘗試這樣做*args:def p(*args):    out = {}    for arg in args:        try:            for key in arg:                try:                    out[key] = a[key]*b[key]                except TypeError:                    out[key] = a[key]*b        except TypeError:            for key in args:                try:                    out[key] = a[key]*b[key]                except TypeError:                    out[key] = a*b[key]        for key in out:            print(key,out[key])但這得到了 TypeErrors,我的頭開始旋轉。編輯添加:如果所有輸入都是數字,我想返回一個數字。
查看完整描述

2 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

最好使用isinstance而不是處理異常來檢查參數是數字還是字典:


def func(*args):

    out = {}

    factor = 1

    for arg in args:

        if isinstance(arg, dict):

            if not out:

                out = arg.copy()

            elif out.keys() != arg.keys():

                raise KeyError('not same keys')

            else:

                for key in out:

                    out[key] *= arg[key]

        else:

            factor *= arg

    for key in out:

        out[key] *= factor

    if out:

        return out

    return factor



print(

    func(

        {'key1': 1, 'key2': 2},

        3,

        {'key1': 10, 'key2': 20},

        4

    )

)


print(func(2, 3))


# result:

# {'key1': 120, 'key2': 480}

# 6


查看完整回答
反對 回復 2022-06-02
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

這是一個可以使用的版本,它使用了一些 Python 的“功能”工具。

實際的乘法是使用functools.reduce完成的,使用operator.mul作為乘法運算符。如果您希望函數執行不同的操作,可以很容易地用operator模塊中的另一個運算符替換它。

一些警告:

  • 該函數通過將非字典參數替換為所有鍵等于非字典參數的字典來處理它們。如果您打算處理非常大的字典或包含大量非字典項的 參數列表,這可能是一個問題。

  • 該函數構建其參數和作為字典的參數的列表;同樣,這對于非常大的輸入來說可能是一個問題。

  • 它不檢查參數是否都是可接受的類型。


import functools

import operator



def p(*args):

    args = list(args)

    dicts = list(filter(lambda x: isinstance(x, dict), args))

    if not dicts:

        # Either there are no arguments, or they all numbers.

        return functools.reduce(operator.mul, args, 0)

    keys = dicts[0].keys()

    if not all(d.keys() == keys for d in dicts):

        raise ValueError(f'Not all dicts have matching keys.')

    for i, arg in enumerate(args):

        # Assume "number" means int or float, but could be complex, or Decimal?

        # See the numbers module for numeric abstract base classes.

        if isinstance(arg, (float, int)):

            args[i] = dict.fromkeys(keys, arg)

    out = {k: functools.reduce(operator.mul, (a[k] for a in args)) for k in keys}

    return out


查看完整回答
反對 回復 2022-06-02
  • 2 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號