为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人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 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信