【问题标题】:How to retain an item in python dictionary? [duplicate]如何在python字典中保留一个项目? [复制]
【发布时间】:2017-05-27 15:05:57
【问题描述】:

我有一本字典 my_dict 和一个令牌列表 my_tok,如图所示:

my_dict = {'tutor': 3,
      'useful': 1,
      'weather': 1,
      'workshop': 3,
      'thankful': 1,
      'puppy': 1}

my_tok = ['workshop',
          'puppy']

是否可以在my_dict 中只保留my_tok 中存在的值而不是弹出其余的值? 即,我只需要保留workshoppuppy

提前致谢!

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    像这样覆盖它:

    my_dict = {k:v for k, v in my_dict.items() if k in my_tok}
    

    这是一个dictionary comprehension,它仅使用my_tok 列表中作为条目存在的键重新创建my_dict

    正如 cmets 中所说,如果my_tok 列表中的元素数量与字典键相比较小,则此解决方案不是最有效的解决方案。在这种情况下,迭代 my_tok 列表会更好,如下所示:

    my_dict = {k:my_dict.get(k, default=None) for k in my_tok}
    

    这或多或少是其他答案所建议的。唯一的区别是使用.get 字典方法允许我们不关心键是否存在于字典中。如果不是,它将被分配 default 值。

    【讨论】:

    • 我会交换迭代器和if 语句,因为您想要保留的键数量非常有限,通常在字典上检查元素会更快。
    • @WillemVanOnsem 非常正确。更新了答案
    【解决方案2】:

    遍历my_tok 中的值,并获取原始字典中的结果。

    my_dict = {i:my_dict[i] for i in my_tok}
    

    【讨论】:

      【解决方案3】:

      创建一个新副本

      你可以简单地覆盖原来的字典:

      new_dic = {token:my_dict[key] for key in my_tok if key in my_dict}
      

      但是请注意,您构建了一个 字典(也许您会立即将其写入 my_dict),但这会产生影响:对字典的其他引用不会反映此更改。

      由于标记 (my_tok) 的数量是有限的,最好迭代这些标记并对字典进行包含检查(而不是循环遍历原始字典中的元组)。

      更新原词典

      如果您想让更改反映在原始字典中,您可以在第二步中.clear() 原始字典和 .update() 相应地:

      new_dic = {token:my_dict[key] for key in my_tok if key in my_dict}
      my_dict.clear()
      my_dict.update(new_dic)
      

      【讨论】:

      • 嗨@willem,感谢您的回答,我认为应该是key 而不是token
      • @Sailesh:你是对的,感谢您指出这一点。
      猜你喜欢
      • 2015-10-21
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2017-06-26
      • 2020-02-19
      • 2020-05-06
      相关资源
      最近更新 更多