python 2.7:通过键的一部分从字典中删除键

时间:2015-12-22 12:25:14

标签: python python-2.7 dictionary

我有一个python字典,由tupples组成的字典键,<​​/ p> 像这样:

{
 (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,
}

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

例如'Remove_'

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

最后字典将如下所示:

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

非常感谢!

4 个答案:

答案 0 :(得分:7)

一种方式:

    >>> 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)}

答案 1 :(得分:5)

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

>>> 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)。如果any()中的某个元素以x开头,则'Remove_'表达式将为true。

答案 2 :(得分:2)

使用相同的词典,但不是单行词。另请注意,原帖说&#34; tupple的一部分出现在键&#34;所以它没有在开头,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}

答案 3 :(得分: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出现在密钥
  • 的任何位置,这将删除密钥