【问题标题】:list comprehension using dictionary entries使用字典条目的列表理解
【发布时间】:2015-11-18 22:20:11
【问题描述】:

试图弄清楚我如何能够对以下内容使用列表理解:

我有一本字典:

dict = {}
dict ['one'] = {"tag":"A"}
dict ['two'] = {"tag":"B"}
dict ['three'] = {"tag":"C"}

我想创建一个列表(我们称之为“列表”),它由每个键的每个“标签”值填充,即

['A', 'B', 'C']

有没有一种使用列表理解的有效方法来做到这一点?我在想这样的事情:

list = [x for x in dict[x]["tag"]]

但显然这并不完全有效。任何帮助表示赞赏!

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    这是一个额外的步骤,但可以获得所需的输出并避免使用保留字:

    d = {}
    d['one'] = {"tag":"A"}
    d['two'] = {"tag":"B"}
    d['three'] = {"tag":"C"}
    new_list = []
    for k in ('one', 'two', 'three'):
        new_list += [x for x in d[k]["tag"]]
    
    print(new_list)
    

    【讨论】:

      【解决方案2】:

      试试这个:

      d = {'one': {'tag': 'A'},
           'two': {'tag': 'B'},
           'three': {'tag': 'C'}}
      
      tag_values = [d[i][j] for i in d for j in d[i]]
      
      >>> print tag_values
      ['C', 'B', 'A']
      

      如果重要,您可以在之后对列表进行排序。

      如果您在内部 dicts 中有其他键/值对,除了 'tag',您可能需要指定 'tag' 键,如下所示:

      tag_value = [d[i]['tag'] for i in d if 'tag' in d[i]]
      

      同样的结果。如果 'tag' 肯定一直存在,请删除 if 'tag' in d[i] 部分。

      附带说明一下,调用 list 'list' 绝不是一个好主意,因为它是 Python 中的保留字。

      【讨论】:

      • 如果内部字典有另一个键,例如{'tag': 'B', 'foo': 'bar'},那么bar 将显示在不正确的输出中。所以这个解决方案是脆弱的。
      • 我从 OP 问题中看不到任何保证内部 dict 始终具有一个键(并且只有一个键)的内容,并且由于 dicts 是可变的,因此任何事情都可能发生。在知道发生了什么之前需要阅读该列表 comp 3 次,我们知道我们想要“标记”键,但我们仍在迭代 a subdict。
      • 编辑列表comp更简单、更好、更快。 +1。哦,为了保证“标签”的存在,更容易在列表组合的末尾说if 'tag' in a[i]。这样就很清楚你想要标签键,如果它不在那里,你就不会抓住你找到的任何东西。
      【解决方案3】:

      你可以试试这个:

      [i['tag'] for i in dict.values()]
      

      【讨论】:

        【解决方案4】:

        我会这样做:

        untransformed = {
            'one': {'tag': 'A'},
            'two': {'tag': 'B'},
            'three': {'tag': 'C'},
            'four': 'bad'
        }
        transformed = [value.get('tag') for key,value in untransformed.items() if isinstance(value, dict) and 'tag' in value]
        

        听起来您正试图从 JSON 中获取一些信息,您可能想研究像 https://stedolan.github.io/jq/manual/ 这样的工具

        【讨论】:

        • 'bad'.get('tag') 不会像你想要的那样处理错误。
        • 是的,我最初有一个 if 语句,但删除了它
        猜你喜欢
        • 1970-01-01
        • 2016-04-21
        • 2020-01-08
        • 2011-02-28
        • 2021-05-09
        • 2023-02-22
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        相关资源
        最近更新 更多