[英]Iterating a list of strings over a dictionary (keys and values) in Python
[英]python: find keys in a dictionary whose values are lists of strings by searching list with a regex return an iterator over the keys
我有一个字典,其项目是字符串列表。 我希望在键上有一个迭代器,它只给那些在项目中有一个与正则表达式匹配的字符串的键。
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”,“us”,“germany”和my_dict.iterkeysregex(“albert”)的迭代器给我“uk”,“us”,“netherlands” 。
怎么写那个功能?
def iterkeysregex ...
请注意,我的dict和每个键的项目列表都很小,所以我并不特别担心效率,例如O(每个键的num keys * num项目*每个项目的regex匹配时间)就好了(两个循环和一场比赛)。 这只是python不是我的第一语言,所以我不确定我会得到正确的语法。
这应该做的伎俩:
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
这是发电机:
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']
最终使用的版本看起来基本上是这样的:
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
感谢所有帮助过的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.