python:在字典中查找键,其值为字符串列表,通过使用正则表达式搜索列表返回键上的迭代器

时间:2016-09-08 14:03:00

标签: python regex dictionary iterator

我有一个字典,其项目是字符串列表。我希望在键上有一个迭代器,它只给那些在项目中有一个匹配正则表达式的字符串的键。

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不是我的第一语言,所以我不确定我会不会正确使用语法。

3 个答案:

答案 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

感谢所有帮助过的人。