我有一个字典,其项目是字符串列表。我希望在键上有一个迭代器,它只给那些在项目中有一个匹配正则表达式的字符串的键。
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"," germany"," netherlands" (可能不是那个顺序,我不在乎)。这就是代码目前使用的内容。
我想让my_dict.iterkeysregex("王子")给我一个迭代器,其中包括" uk","我们","德国"和my_dict.iterkeysregex(" albert")给我" uk","我们","荷兰"。
如何编写该功能?
def iterkeysregex ...
请注意,我的dict和每个键的项目列表都很小,所以我并不特别担心效率,例如: O(每个键的num keys * num项目*每个项目的正则表达式匹配时间)就好了(两个循环和一个匹配调用)。它只是python不是我的第一语言,所以我不确定我会不会正确使用语法。
答案 0 :(得分:0)
这应该可以解决问题:
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
答案 1 :(得分:0)
这是发电机:
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']
答案 2 :(得分:0)
我最终使用的版本看起来基本上是这样的:
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
感谢所有帮助过的人。