【问题标题】:Python 3 - how to retrieve return value from inside a dictionary comprehension for use in another method?Python 3 - 如何从字典理解中检索返回值以用于另一种方法?
【发布时间】:2017-07-18 09:36:31
【问题描述】:

Python 新手在这里学习字典理解。考虑以下示例字典,该字典具有进一步的字典作为其值(它们是否称为“多维字典”?只是想知道。):

 maindictionary = {
'key1':{'key11':'value11','key12':'value12'},
'key2':{'key21':'value21','key22':'value22'}, 
'key3':{'key31':'value31','key32':'value32'},
'key4':{'key41':'value41','key42':'value42'}
}

我想在产生结果的字典理解中的函数中遍历主字典,然后可以在另一个函数的循环中使用该结果。算法如下:

  • 遍历字典,并将每个键的值发送到 functionA,除非 key 等于 key3 或 key4。

  • functionA 获取结果并将其传递给functionB

  • 进入下一次迭代。

functionA 也返回一个字典。 functionB 只是打印出结果。

我有一个模糊的想法,它看起来类似于下面的代码,这是我迄今为止测试过的,它给出了语法错误:

{result:functionA(v) for (k,v) in maindictionary if (k != 'key3' or k != 'key4')}
   functionB(result)

我在这里的语法可能完全错了,所以如果你能指出一个好的字典理解资源(不是官方的 python 文档,它们对于初学者来说很难理解),那就太好了!

编辑

functionA 的输出将创建两个字典,{'key11':'value11'}{'key21':'value21'}(每次迭代)。然后将这些输入functionB,输出value11,然后输出value21(每次迭代)。

我想使用来自functionA 的结果,即输入到functionB 的字典,然后检索它的值。

【问题讨论】:

  • 你说你想要一个字典理解,但是字典的键和值是什么?如果我正确理解了这个问题,值应该是functionB(functionA(v)),但是键是什么?
  • 使用了dict-comprehension,因为它创建了dicts。 Ofc 你可以在字典理解中运行函数,但是你想将结果存储dict 中吗?如果不只是循环。 result 是什么?
  • 您不能将字典用作字典键。如果您包含functionAfunctionB 的实现以及您想要的结果/输出,可能会更容易理解这个问题。
  • 除了创建数据结构之外,不要使用理解来做其他事情。听起来你想要一个循环。
  • @omrakhur 我担心你试图以错误的方式 Pythonic 并最终困惑编写糟糕的代码我>。只是循环。

标签: python python-3.x dictionary dictionary-comprehension


【解决方案1】:

字典理解旨在创建字典。在您的特定情况下,您正在使用已经存在的字典。我不相信您正在寻找正确的范例。我建议使用生成器之类的东西,并单独传递每个值,如下所示:

def functionA(__dict):
    for k in __dict:
        if k not in ['key3', 'key4']:
            yield __dict[k]

main_dict = {...}
for item in functionA(main_dict):
    functionB(item)

functionA 是一个生成器,它遍历字典,产生有效键的项目,然后传递给functionB

【讨论】:

    【解决方案2】:
    functionB({'result'+str(i):functionA(d[1]) for i,d in enumerate(maindictionary.items()) if d[0] not in ("key3","key4")})
    list(map(lambda d: functionB(d[1]), resA.items()))
    

    如果您从 functionB 返回任何值,您的最​​终结果将是一个列表,否则执行该函数并返回一个无列表

    【讨论】:

      【解决方案3】:

      正如前面的 cmets 中提到的,dictcomprehension 是用来创建字典的,如果你不打算创建字典,那何必呢。

      话虽如此,如果您绝对想要列表/字典理解,您可以编写代码来使用/滥用它们,因为它们的行为就像有限的for-loops。 所以这里有两个版本,第一个使用常规 for 循环,第二个使用 dict-comprehension 作为 for 循环:

      maindictionary = {
      'key1':{'key11':'value11','key12':'value12'},
      'key2':{'key21':'value21','key22':'value22'}, 
      'key3':{'key31':'value31','key32':'value32'},
      'key4':{'key41':'value41','key42':'value42'}
      }
      
      def functionA(d):
          #splits a dictionary into several dictionaries
          for k,v in d.items():
              yield {k:v}
      
      def functionB(d):
          #print one value from d
          print(list(d.values())[0])
      
      
      
      #method 1
      print("method 1:")
      for k,v in maindictionary.items():
          if k != 'key3' and k != 'key4' :
              for small_dict in functionA(v):
                  functionB(small_dict)
      
      #method 2
      print("method 2:")
      {'dummy key':{'dummy key':functionB(small_dict) for small_dict in functionA(v)} for (k,v) in maindictionary.items() if (k != 'key3' and k != 'key4')}
      

      输出:

      method 1:
      value11
      value12
      value21
      value22
      method 2:
      value11
      value12
      value21
      value22
      

      【讨论】:

        【解决方案4】:

        删除额外的if 条件:

        {result:functionA(v) for (k,v) in maindictionary if (k != 'key3' or k != 'key4')}
        

        【讨论】:

        • 即使result 无论如何都被定义为可散列的东西,您仍将继续覆盖它的值。
        猜你喜欢
        • 2022-11-29
        • 1970-01-01
        • 2017-04-23
        • 2017-03-19
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        相关资源
        最近更新 更多