首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python:在字典中查找值为字符串列表的键,方法是使用正则表达式搜索list,在键上返回迭代器

python:在字典中查找值为字符串列表的键,方法是使用正则表达式搜索list,在键上返回迭代器
EN

Stack Overflow用户
提问于 2016-09-08 22:03:00
回答 3查看 299关注 0票数 1

我有一本字典,它的词条有一系列的字符串.我想要一个遍历键的迭代器,它只给我那些在它们的项中有一个匹配正则表达式的字符串的键。

代码语言:javascript
运行
复制
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”。

如何编写该函数?

代码语言:javascript
运行
复制
def iterkeysregex ...

注意,我的dict和每个key的项目列表都很小,所以我并不特别担心效率,例如O(num key * num item per key* regex match time per item)就足够了(两个循环和一个匹配调用)。只是python不是我的第一语言,所以我不确定我的语法是否正确。

EN

回答 3

Stack Overflow用户

发布于 2016-09-08 22:41:10

这应该能起到作用:

代码语言:javascript
运行
复制
text = 'prince'
keys = set([key for key in my_dict for item in my_dict[key] if text in item])

或者作为一个函数:

代码语言:javascript
运行
复制
def trick(text, values):
    keys = set([key for key in values for item in my_dict[key] if text in item])
    return keys
票数 0
EN

Stack Overflow用户

发布于 2016-09-08 22:54:44

下面是生成器:

代码语言:javascript
运行
复制
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

用法

代码语言:javascript
运行
复制
for x in iterkeysregex('to', my_dict):
  print(x, " --> ", my_dict[x])

结果:

代码语言:javascript
运行
复制
uk  -->  ['prince albert', 'princes diana', 'elton john', 'john lennon']
germany  -->  ['otto von bismark', 'prince karl', 'goethe']
票数 0
EN

Stack Overflow用户

发布于 2016-09-09 03:14:41

我最终使用的版本基本上是这样的:

代码语言:javascript
运行
复制
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

感谢所有帮助我的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39393029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档