【问题标题】:Return copy of dictionary excluding specified keys返回不包括指定键的字典副本
【发布时间】:2015-10-04 16:55:52
【问题描述】:

我想创建一个函数,它返回字典的副本,不包括列表中指定的键。

考虑这本字典:

my_dict = {
    "keyA": 1,
    "keyB": 2,
    "keyC": 3
}

without_keys(my_dict, ['keyB', 'keyC']) 的调用应该返回:

{
    "keyA": 1
}

我想用简洁的字典理解在一行中执行此操作,但我遇到了麻烦。我的尝试是这样的:

def without_keys(d, keys):
    return {k: d[f] if k not in keys for f in d}

这是无效的语法。我该怎么做?

【问题讨论】:

    标签: python dictionary key dictionary-comprehension


    【解决方案1】:

    你的单线器

    my_dict = {"keyA": 1, "keyB": 2, "keyC": 3}
    (lambda keyB, keyC, **kw: kw)(**my_dict)
    

    返回{'keyA': 1}。 不是很 Pythonic 和动态,但是 hacky 和简短。 它使用函数参数的 dict 解包(解构赋值)。

    另请参阅 https://stackoverflow.com/a/53851069/11769765.

    【讨论】:

      【解决方案2】:

      您可以将此概括为嵌套字典解决方案

      def copy_dict(data, strip_values=False, remove_keys=[]):
          if type(data) is dict:
              out = {}
              for key, value in data.items():
                  if key not in remove_keys:
                      out[key] = copy_dict(value, strip_values=strip_values, remove_keys=remove_keys)
              return out
          else:
              return [] if strip_values else data
      

      这种递归解决方案适用于嵌套字典,并从整个嵌套结构中删除不需要的键。它还使您能够返回只有键而没有值的嵌套。

      【讨论】:

        【解决方案3】:

        甚至更短。显然,python 3 可以让您从 dict_keys 中“减去”list

        def without_keys(d, keys):
            return {k: d[k] for k in d.keys() - keys}
        

        【讨论】:

        【解决方案4】:

        对于那些不喜欢列表推导的人,这是我的版本:

        def without_keys(d, *keys):
             return dict(filter(lambda key_value: key_value[0] not in keys, d.items()))
        

        用法:

        >>> d={1:3, 5:7, 9:11, 13:15}
        >>> without_keys(d, 1, 5, 9)
        {13: 15}
        >>> without_keys(d, 13)
        {1: 3, 5: 7, 9: 11}
        >>> without_keys(d, *[5, 7])
        {1: 3, 13: 15, 9: 11}
        

        【讨论】:

          【解决方案5】:

          你很接近,试试下面的sn-p:

          >>> my_dict = {
          ...     "keyA": 1,
          ...     "keyB": 2,
          ...     "keyC": 3
          ... }
          >>> invalid = {"keyA", "keyB"}
          >>> def without_keys(d, keys):
          ...     return {x: d[x] for x in d if x not in keys}
          >>> without_keys(my_dict, invalid)
          {'keyC': 3}
          

          基本上,if k not in keys 在上述情况下会出现在字典理解的末尾。

          【讨论】:

          • 您声明无效的集合。这有什么原因吗?一个列表也足够了吗?
          • 是的,list 也足够了(你可以试试),但通常当顺序对你来说不重要时,set 是首选(即使从性能方面来看,这在这个简短的例子中并不重要只需少量数据)。
          • 这是否比获取所有键然后使用 for 循环手动跳过不需要的键更快?
          【解决方案6】:

          在您的字典理解中,您应该遍历您的字典(不是 k ,也不确定那是什么)。示例 -

          return {k:v for k,v in d.items() if k not in keys}
          

          【讨论】:

          • 我更喜欢这个解决方案,因为它可以(微小)节省不调用 d[x] 索引操作。
          • 虽然这是一个浅拷贝
          【解决方案7】:

          这应该适合你。

          def without_keys(d, keys):
              return {k: v for k, v in d.items() if k not in keys}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-08
            • 2018-07-09
            • 1970-01-01
            • 1970-01-01
            • 2020-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多