【问题标题】:pass multiple dictionaries to a function as an argument将多个字典作为参数传递给函数
【发布时间】:2023-03-26 19:40:02
【问题描述】:

我有两本词典:

SP = dict{'key1': 'value1','key2': 'value2'}
CP = dict{'key1': 'value1','key2': 'value2'}

我有一个函数想将这两个字典作为输入,但我不知道该怎么做。

我试过了:

def test(**SP,**CP):
    print SP.keys(),CP.keys()

test(**SP,**CP)

对两个字典进行大量修改,实际功能会更加复杂。 但是简单的测试功能对我不起作用:(

【问题讨论】:

    标签: python dictionary arguments


    【解决方案1】:

    如果您只想将两个字典作为单独的参数,只需这样做

    def test(SP, CP):
        print SP.keys(),CP.keys()
    
    test(SP, CP)
    

    仅当您想将字典的各个键/值对作为单独的关键字参数传递时,才使用**。如果您将整个字典作为单个参数传递,则只需传递它,就像传递任何其他参数值一样。

    【讨论】:

      【解决方案2】:

      如果您想将两个不同的字典传递给一个函数,而该函数都包含您的函数的参数,您应该首先合并这两个字典。

      例如:

      dicA = {'spam':3, 'egg':4}
      dicB = {'bacon':5, 'tomato':6}
      
      def test(spam,tomato,**kwargs):
          print spam,tomato
      
      #you cannot use:
      #test(**dicA, **dicB)
      

      所以你必须合并两个字典。有几种选择:见How to merge two Python dictionaries in a single expression?

      dicC = dicA.copy()
      dicC.update(dicB)
      
      #so now one can use:
      test(**dicC)
      
      >> 3 6
      

      【讨论】:

        【解决方案3】:

        您可以使用 dict 构造函数将两个字典(SPCP)组合成一个字典。

        test(**dict(SP,**CP))
        

        【讨论】:

        • 或者test(**{**SP,**CP}),如果你愿意的话。 (可能是因为你对不对称或字典这个词过敏。)
        【解决方案4】:

        为什么它不起作用:

        在 Python 中,参数中的“**”前缀是为了让一个参数捕获其他几个参数。例如:

        SP = {'key1': 'value1','key2': 'value2'}
        
        def test(**kwargs):              #you don't have to name it "kwargs" but that is
            print(kwargs)                #the usual denomination
        
        
        test(**SP)
        test(key1='value1', key2='value2')
        

        测试函数上的两次调用完全一样

        用两个 ** 参数定义一个函数会模棱两可,所以你的解释器不会接受它,但你不需要它。

        如何使它工作:

        在使用普通字典参数时没有必要使用**:在这种情况下,您可以简单地这样做:

        SP = {'key1': 'value1','key2': 'value2'}
        CP = {'key1': 'value1','key2': 'value2'}
        
        def test(SP,CP):
            print(SP)
            print(CP)
        
        test(SP,CP)
        

        字典是可以直接在参数中使用的对象。如果要保留原始字典,则需要注意的唯一一点是不要直接修改参数中的字典。

        【讨论】:

          【解决方案5】:

          使用*args 接受多个参数。

          SP={'key1':'value1','key2':'value2'}  `dict{'key1':'value1','key2':'value2'}` 
          CP={'key1':'value1','key2':'value2'}
          
          def test(*args):
              for arg in args:
                  print arg.keys(),
          
          test(SP,CP)
          ['key2', 'key1'] ['key2', 'key1']
          

          【讨论】:

            【解决方案6】:
            def merge(*d):
               r={}
               for x in d:r.update(x)
               return r
            
            d1={'a': 1, 'b': 2}
            d2={'y': 4, 'x': 3}
            
            def f(**k): print(k)
            
            f(**merge(d1,d2))   # you're on your own if keys repeat unintentionally
            

            给出 {'a': 1, 'y': 4, 'b': 2, 'x': 3}

            【讨论】:

              【解决方案7】:

              如果您想避免组合字典,则将它们作为参数而不是关键字参数提供,并将它们的默认值设置为某个值(例如None),并将None 转换为{},否则复制字典.

              SP = {'key1': 'value1', 'key2': 'value2'}
              CP = {'key1': 'value3', 'key2': 'value4'}
              
              def test(SP=None, CP=None):
                  SP = {} if SP is None else SP.copy()
                  CP = {} if CP is None else CP.copy()
                  # Now use SP and CP as keyword arguments to other functions
                  foo(**SP)
                  baz(**CP)
              
              def foo(**kws):
                  print(kws.items())
              
              def baz(**kws):
                  print(kws)
              
              test(SP=SP)
              test(CP=CP)
              test(SP, CP)
              

              在将关键字参数传递给在我的函数中调用的不同绘图函数时,我经常这样做,并且我向这些绘图函数发送不同的关键字参数字典。

              【讨论】:

                【解决方案8】:

                TLDR:传递字典的字典

                我发现自己遇到了同样的问题,我无法合并字典,因为我想在被调用函数中将每个字典的内容分开。 我找到的解决方案是使用嵌套字典。

                    args = {}
                    args['SP'] = dict{'key1': 'value1','key2': 'value2'}
                    args['CP'] = dict{'key1': 'value1','key2': 'value2'}
                
                    test(**args)
                
                    def test (**kwargs):
                        arg_sp = kwargs.get('SP')
                        arg_cp = kwargs.get('CP')
                

                【讨论】:

                  【解决方案9】:

                  由于通常kwargs 用于添加无数函数参数,因此同时使用两个kwargs 有点不寻常。但换一种方式,可以将两个字典作为常用参数进行参数化。因此,对代码片段进行一些更改可能会有所帮助:

                  SP = {'key1': 'value1','key2': 'value2'}
                  CP = {'key1': 'value1','key2': 'value2'}
                  def test(SP,CP):
                      print(SP.keys(),CP.keys())
                  
                  test(SP,CP)
                  

                  输出: dict_keys(['key1', 'key2']) dict_keys(['key1', 'key2'])

                  【讨论】:

                    猜你喜欢
                    • 2017-10-01
                    • 2013-10-29
                    • 2010-09-24
                    • 2021-12-14
                    • 2013-01-27
                    • 1970-01-01
                    • 2022-11-11
                    • 2019-09-14
                    相关资源
                    最近更新 更多