对任意多个字典和数字进行数学运算

我想做以下事情:

  • 采用任意数量的字典或数字参数

  • 作为字典的参数,检查它们是否都具有相同的键(否则错误)

  • 做类似的事情

    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,我的头开始旋转。


编辑添加:如果所有输入都是数字,我想返回一个数字。


牧羊人nacy
浏览 116回答 2
2回答

莫回无

最好使用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 factorprint(    func(        {'key1': 1, 'key2': 2},        3,        {'key1': 10, 'key2': 20},        4    ))print(func(2, 3))# result:# {'key1': 120, 'key2': 480}# 6

汪汪一只猫

这是一个可以使用的版本,它使用了一些 Python 的“功能”工具。实际的乘法是使用functools.reduce完成的,使用operator.mul作为乘法运算符。如果您希望函数执行不同的操作,可以很容易地用operator模块中的另一个运算符替换它。一些警告:该函数通过将非字典参数替换为所有键等于非字典参数的字典来处理它们。如果您打算处理非常大的字典或包含大量非字典项的 参数列表,这可能是一个问题。该函数构建其参数和作为字典的参数的列表;同样,这对于非常大的输入来说可能是一个问题。它不检查参数是否都是可接受的类型。import functoolsimport operatordef 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python