【问题标题】:Nested loops in dictionary comprehension字典理解中的嵌套循环
【发布时间】:2015-10-13 05:55:22
【问题描述】:

我有一个现有的字典列表如下:

FA = [{u'child': [{u'cdesc': u'Audit'},
                  {u'cdesc': u'Equity Research'},
                  {u'cdesc': u'Finance / Accounts / Tax'},
                  {u'cdesc': u'Investment Banking / M&A'}],
       u'pdesc': u'Finance / Accounts / Investment Banking',
       u'pid': 10007}]

我想把它转换成这样的:

FA = {u'Audit':2,
     u'Equity Research':2,
     u'Finance / Accounts / Tax':2,
     u'Investment Banking / M&A':2,
     u'Finance / Accounts / Investment Banking':2}

我可以使用嵌套循环轻松做到这一点,其代码如下所示。有没有办法使用字典理解来做到这一点?

a = dict()
for fa in FA:
    a.update({slugify(fa['pdesc']):2})


    for c in fa['child']: 
        a.update({slugify(c['cdesc']):2})

【问题讨论】:

  • 为什么值是2
  • 请同时使用嵌套循环的方法更新代码。
  • @AdamSmith 硬编码值。想要他们。
  • 你如何确定新字典的keys
  • 我已经更新了代码。展示了我如何使用循环来做到这一点。

标签: python dictionary dictionary-comprehension


【解决方案1】:

字典理解在这里看起来很丑……反正……

# METHOD 1
FA_dict1 = {d:2 for v in FA[0][u'child'] for d in v.values()}
FA_dict1.update({FA[0][u'pdesc']: 2})


# METHOD 2
from itertools import chain
FA_dict = {d:2 for v in FA[0][u'child'] for d in chain(v.values(), [FA[0][u'pdesc']])}


# METHOD 3
FA_DICT = {d:2 for v in FA[0][u'child'] for d in list(v.values())+[FA[0][u'pdesc']]}

【讨论】:

    【解决方案2】:

    领悟解果然是丑小鸭!

    在上述数据上运行:

    { k:2 for k in reduce(lambda x,y: x+y, [ [ chld[u'cdesc'] for chld in FA[0]['child'] ], [ FA[0][u'pdesc'] ] ] ) }
    
    {u'Audit': 2,
     u'Equity Research': 2,
     u'Finance / Accounts / Investment Banking': 2,
     u'Finance / Accounts / Tax': 2,
     u'Investment Banking / M&A': 2}
    

    【讨论】:

    • 好吧,有些人喜欢它,有些人讨厌它。此解决方案还使用列表理解。 lambda 和理解的复杂性是相同的。只是取决于程序员。
    【解决方案3】:

    这会让你开始吗?

    { chld[u'cdesc']:2 for chld in FA[0]['child'] }
    

    产生(不是 100% 而是接近):

    {u'Audit': 2,
     u'Equity Research': 2,
     u'Finance / Accounts / Tax': 2,
     u'Investment Banking / M&A': 2}
    

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 2021-06-03
      • 1970-01-01
      • 2017-07-22
      • 2022-06-15
      • 2021-07-16
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多