我有一本字典,它的词条有一系列的字符串.我想要一个遍历键的迭代器,它只给我那些在它们的项中有一个匹配正则表达式的字符串的键。
my_dict = { "uk" : ["prince albert", "princes diana", "elton john", "john lennon"],
"us" : ["albert einstein", "prince", "john cage", "president bush"],
"germany" : ["otto von bismark", "prince karl", "goethe"],
"netherlands" : ["albert durer", "rembrandt"]
}
my_dict.iterkeys()为我提供了一个迭代器,其中包含"uk“、"us”、“德国”、“荷兰”(显然不是按这个顺序,我不在乎)。这就是代码当前使用的内容。
我想让王子(“my_dict.iterkeysregex”)给我一个包含"uk“、"us”、“德国”和my_dict.iterkeysregex("albert")的迭代器,让我得到"uk“、"us”、“my_dict.iterkeysregex”。
如何编写该函数?
def iterkeysregex ...
注意,我的dict和每个key的项目列表都很小,所以我并不特别担心效率,例如O(num key * num item per key* regex match time per item)就足够了(两个循环和一个匹配调用)。只是python不是我的第一语言,所以我不确定我的语法是否正确。
发布于 2016-09-08 22:41:10
这应该能起到作用:
text = 'prince'
keys = set([key for key in my_dict for item in my_dict[key] if text in item])
或者作为一个函数:
def trick(text, values):
keys = set([key for key in values for item in my_dict[key] if text in item])
return keys
发布于 2016-09-08 22:54:44
下面是生成器:
def iterkeysregex(regexp, dict):
cr = re.compile(regexp)
# index keys
match_keys = [k for k, v in dict.items() if cr.search("".join(v))]
# generating
for k in match_keys:
yield k
用法
for x in iterkeysregex('to', my_dict):
print(x, " --> ", my_dict[x])
结果:
uk --> ['prince albert', 'princes diana', 'elton john', 'john lennon']
germany --> ['otto von bismark', 'prince karl', 'goethe']
发布于 2016-09-09 03:14:41
我最终使用的版本基本上是这样的:
def iterkeysregex(my_dict, my_regex):
regex = re.compile(my_regex)
for k, v in my_dict.iteritems():
for s in v:
if re.search(regex, s):
yield k
感谢所有帮助我的人。
https://stackoverflow.com/questions/39393029
复制相似问题