python 2.7:按部分键从字典中删除键

Posted

技术标签:

【中文标题】python 2.7:按部分键从字典中删除键【英文标题】:python 2.7 : remove a key from a dictionary by part of key 【发布时间】:2016-03-28 17:18:03 【问题描述】:

我有一个python字典,字典键由元组组成,

像这样:


 (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Me'): 300, 
 (u'A_String_0', u'B_String_4'): 301, 
 (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Key'): 301,

当只有部分元组出现在键中时,我想从字典中删除所有键:

例如'Remove_'

在这种情况下,必须弹出两个键:一个包含u'Remove_Me',另一个包含u'Remove_Key'

字典最终会是这样的:


  (u'A_String_0', u'B_String_4'): 301

非常感谢!

【问题讨论】:

u'Do_Don't_Remove_Me' 呢? filter items in a python dictionary where keys contain a specific string的可能重复 【参考方案1】:

一种方式:

    >>> d = 
     (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Me'): 300, 
     (u'A_String_0', u'B_String_4'): 301, 
     (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Key'): 301,
    
    >>> 
    >>> 
    >>> d_out = k:v for k,v in d.items() if not any(x.startswith('Remove_') for x in k)
    >>> d_out
(u'A_String_0', u'B_String_4'): 301

编辑:如果您想检查 Remove_ 是否是元组键的任何项目的一部分,那么您最好:

>>> d_out = k:v for k,v in d.items() if not any('Remove_' in x for x in k)

【讨论】:

i:j for i,j in d.items() if not any('Remove_' in x for x in i) 感谢@AvinashRaj 的提醒 如果键内可能有元素DontRemove_Me,请不要使用它;) @poke op 说“只有部分元组出现在键中”,而不是开头。 @AvinashRaj 这可以指字符串位于元组键中的任何位置,或者该子字符串位于特定字符串中的任何位置。不完全清楚,所以最好只提及一种解决方案对另一种解决方案的影响:)【参考方案2】:

如果是sartswith,您已经得到了答案。如果没有,那么您可以使用inre for more complex checking

代码:

import re
dic = 
 (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Me'): 300, 
 (u'A_String_0', u'B_String_4'): 301, 
 (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Key'): 301,

print k:v for k,v in dic.items() if not any(re.match("Remove", val)for val in k) # Using in
print k:v for k,v in dic.items() if not any("Remove" in val for val in k) # Using re.match

输出:

(u'A_String_0', u'B_String_4'): 301

注意:

如果Remove 出现在密钥中的任何位置,这将删除密钥

【讨论】:

【参考方案3】:

使用相同的字典,但不是单行字典。另请注意,原始帖子说“元组的一部分出现在键中”所以它不是在开头,即startswith()

>>> d = 
...      (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Me'): 300, 
...      (u'A_String_0', u'B_String_4'): 301, 
...      (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Key'): 301,
...     
>>> for k in d.keys():
...     for i in k:
...         if 'Remove_' in i:
...             del d[k]
...             break
... 
>>> d
(u'A_String_0', u'B_String_4'): 301

【讨论】:

【参考方案4】:

由于键始终是没有任何结构或模式的组合物,因此您始终需要拥有完整的键才能访问字典中的元素。特别是这意味着您无法使用某些部分键找到元素。所以为了做到这一点,除了查看所有键之外别无他法:

>>> d = 
 (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Me'): 300, 
 (u'A_String_0', u'B_String_4'): 301, 
 (u'A_String_0', u'A_String_1', u'B_String_3', u'Remove_Key'): 301
>>>  k: v for k, v in d.items() if not any(x.startswith('Remove_') for x in k) 
(u'A_String_0', u'B_String_4'): 301

这将从源字典创建一个新字典,获取 k 不正确的每个键 any(x.startswith('Remove_') for x in k)。如果x 中有一个以'Remove_' 开头的元素,那么any() 表达式将为真。

【讨论】:

以上是关于python 2.7:按部分键从字典中删除键的主要内容,如果未能解决你的问题,请参考以下文章

如何根据ios中的特定键从数组中获取字典

如何通过键从 GAE 数据存储中删除多个实体

如何通过键从 URL 中有效地删除查询字符串?

使用元组键从字典创建 MultiIndex pandas DataFrame

Python ❀ 字典

Python ❀ 字典