【问题标题】:Union with nested list/multiple for loops与嵌套列表/多个 for 循环联合
【发布时间】:2019-11-19 12:37:36
【问题描述】:

我有一本这样的字典:

myDict = {'items':
            [{'names': [{'longName1', 'shortName1'},
                      {'shortName2', 'longName2'}]},
            {'names': [{'longName3', 'shortName3'},
                      {'shortName4', 'longName4'}]}]}

尝试以 Python 方式获取集合中的键(即短名称)。我有以下声明,但它抱怨 i 没有定义。我做错了什么?

shortNames = set().union(*(j.values() for j in i["names"] for i in myDict["items"]))

预期结果:

set(['shortName1', 'shortName2', 'shortName3', 'shortName4'])

【问题讨论】:

    标签: python list dictionary set union


    【解决方案1】:

    您在ii in myDict["items"] 定义之前访问i["names"]

    【讨论】:

    • 啊...所以我需要交换语句。
    【解决方案2】:

    您必须交换 for 循环:

    set().union(*[j for i in myDict["items"] for j in i["names"]])
    

    【讨论】:

      【解决方案3】:

      看,为了简洁起见,链接list comprehensions 是不可取的。既然你在问,一种方法是:

      >>> from itertools import chain
      >>> {j for j in (chain.from_iterable(sum([i['names'] for i in myDict['items']],[]))) if j.startswith('short')}
      
      {'shortName1', 'shortName2', 'shortName3', 'shortName4'}
      

      你的方法不起作用:

      1. 正如dacx 提到的那样。

      2. j.values() 不会给你shortNames,因为它们在sets 而不是dicts,并且sets 没有.values() 方法。


      或者:

      >>> {j for j in set().union(*(set().union(*i['names']) for i in myDict['items'])) if j.startswith('short')}
      {'shortName1', 'shortName2', 'shortName3', 'shortName4'}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-15
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多