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
,您已经得到了答案。如果没有,那么您可以使用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
出现在密钥中的任何位置,这将删除密钥
【讨论】:
【参考方案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:按部分键从字典中删除键的主要内容,如果未能解决你的问题,请参考以下文章