繁体   English   中英

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM