我有一个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
}
非常感谢!
答案 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
,您已经得到了答案。如果没有,那么您可以使用in
或re 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
出现在密钥