首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在字典关键字中搜索模式

在字典关键字中搜索模式
EN

Stack Overflow用户
提问于 2020-01-13 17:29:02
回答 1查看 68关注 0票数 0

我想搜索一些给定模式的python字典关键字。这更像是子字符串搜索,但使用的是char级别。下面的代码运行良好,但我需要一些调整,因为它将有性能问题时,我们有数千个键。哈希键有排序的字母表。通过关键字的字母顺序排序,我的意思是字典中的每个关键字(单词)本身都是排序的,而不是整个字典根据关键字进行排序。也就是说,key可以是aaklm,而不是kamal

另外,这个搜索部分有没有什么外部库/API?

代码语言:javascript
运行
AI代码解释
复制
import re

def getKey(str, list):
    expr = re.compile(str)
    return [elem for elem in list if expr.match(elem)]


wordDict = {'AADFLORW':['value1'], 'AAAGRU': ['VAL1', 'SOME DIFFERENT VALUE']}
m = re.compile(u'[a-zA-Z]').findall('ADOLF')    # I'm searching ADOLF in the keys
pat = '.*' + '(.*)'.join(sorted(m)) + '.*'

for key in getKey(pat, wordDict.keys()):
    print(key)
EN

回答 1

Stack Overflow用户

发布于 2020-01-13 20:58:27

与现在一样,搜索的主要部分将是根据模式检查wordDict中的每个键。我能想到的一种优化是减少这种搜索。

首先,我构建了“元”字典,其中键是wordDict键的字符列表,值是wordDict键的列表。

getKey()中,使用这个元字典,我只检查可能匹配的键(所以不是所有键)。

代码语言:javascript
运行
AI代码解释
复制
import re
from itertools import chain, combinations

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def getKey(string, pat, meta):
    k = ''.join(sorted(set(string)))
    expr = re.compile(pat)
    return [elem for elem in meta[frozenset(k)] if expr.match(elem)] # <--- here I search only valid keys (keys where there's possibility of match)

wordDict = {'AADFLORW':['value1'], 'AAAGRU': ['VAL1', 'SOME DIFFERENT VALUE']}

# build meta information about wordDict.keys()
# This could take a while!!!
meta = {}
for k in wordDict.keys():
    for p in powerset(set(k)):
        if p:
            meta.setdefault(frozenset(p), []).append(k)

# from pprint import pprint
# pprint(meta)

m = re.compile(r'[a-zA-Z]').findall('ADOLF')    # I'm searching ADOLF in the keys
pat = '.*' + '(.*)'.join(sorted(m)) + '.*'

for key in getKey('ADOLF', pat, meta):
    print(key)

打印:

代码语言:javascript
运行
AI代码解释
复制
ADFLORW

为了举例说明,"meta“字典现在看起来像这样:

代码语言:javascript
运行
AI代码解释
复制
{frozenset({'A'}): ['AADFLORW', 'AAAGRU'],
 frozenset({'D'}): ['AADFLORW'],
 frozenset({'L'}): ['AADFLORW'],
 frozenset({'R'}): ['AADFLORW', 'AAAGRU'],
 frozenset({'W'}): ['AADFLORW'],
 frozenset({'O'}): ['AADFLORW'],
 frozenset({'F'}): ['AADFLORW'],
 frozenset({'A', 'D'}): ['AADFLORW'],
 frozenset({'A', 'L'}): ['AADFLORW'],
 frozenset({'A', 'R'}): ['AADFLORW', 'AAAGRU'],
 frozenset({'W', 'A'}): ['AADFLORW'],

...

它可能相当大,所以现在你是在用“空间”来换取“速度”。

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

https://stackoverflow.com/questions/59721318

复制
相关文章
在 Linux 上为特定的用户或用户组启用或禁用 SSH
由于你的公司标准规定,你可能只能允许部分人访问 Linux 系统。或者你可能只能够允许几个用户组中的用户访问 Linux 系统。那么如何实现这样的要求呢?最好的方法是什么呢?如何使用一个简单的方法去实现呢?
用户9104802
2021/11/22
2.6K0
用户与组管理
centos7规定:    0         超级管理员,最高权限,有极强的破坏能力    1-200     系统用户,由系统分配给系统进程使用    201-999   系统用户,用来运行安装的程序,所以此类用户无需登录系统(动态分配)    1000+     普通常规用户,正常可以登录系统的用户,权限比较小,能执行任务有限
贾维斯Echo
2023/10/18
3280
用户和组管理
增加用户 # useradd test 删除用户 # userdel test 增加组 # groupadd testgroup 删除组 # groupdel testgroup usermod命令
零月
2018/04/25
5840
用户和组管理
LDAP 管理用户(组)
LDAP实现提供被称为目录服务的信息服务,可以看做是一张特殊的数据库系统。可以有效的解决众多网络服务的用户账户问题,规定了统一的身份信息数据库、身份认证机制和接口,实现了资源和信息的统一管理,保证了数据的一致性和完整性。
菲宇
2019/06/12
4.3K0
Linux 用户和用户组管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户4988376
2021/07/20
5.1K0
Linux 用户和用户组管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
云叶知秋
2021/02/02
5.4K0
Linux之用户管理(用户和用户组)
Linux 是多用户多任务操作系统,换句话说,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。
抖音hzcya
2021/08/23
3.2K0
Linux基础-用户管理与组管理
一、分类 1、按账户身份的访问控制进行分类 ①用户账号(用 UID 来识别) ②组账号(用 GID 来识别) 2、按用户账号分类 ①超级用户 root ②系统用户 ③普通用户 3、按组账号分类(组账号用来区分权限,不用于登录) 基本组 (私有组) 附加组 (从属组) 二、账号文件与密码文件 1、本地账号数据的存放在本地磁盘中,包括用户账号数据文件和组账号数据文件 1)用户账号数据文件 /etc/passwd(用户账号文件) /etc/shadow (用户密码文件) 2)组账号数据文件 /etc/group(
入门笔记
2022/06/03
6610
3.2 用户组管理
/etc/group组的配置文件 /etc/group文件是存放组的配置文件 [root@hf-01 ~]# ls /etc/group /etc/group [root@hf-01 ~]# head -n4 /etc/group root:x:0: bin:x:1: daemon:x:2: sys:x:3: /etc/gshadow组的密码配置文件 /etc/gshadow文件是存放组密码配置文件 [root@hf-01 ~]# head -n4 /etc/gshadow root::: bin::: d
运维小白
2022/01/06
3840
linux用户与组管理
超级用户:root uid=0 用户身份user identify 普通用户:可以登录系统 uid 500-60000 程序用户:程序依托一个用户的权限,权限非常小,不能登陆系统 uid 1-499
阿七日记
2022/01/17
2.5K0
Linux用户和组管理
PASSWORD:口令,系统用口令来验证用户的合法性口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。
职场亮哥
2020/10/10
2.5K0
Linux用户及组管理
组:GID(逻辑容器,包含用户;实现多个用户对于某个文件或者应用程序分配相同的权限)
用户8449980
2021/07/11
2.4K0
用户组的管理
解释组账号文件 /etc/group:保存组账号的基本信息 10.png /etc/gshadow,保存组账号的管理信息 20.png 添加组账号(groupadd) 格式:groupadd [选项] 组名 选项 - -g:为组名设置GID [root]# groupadd stugrp 管理组成员(gpasswd) 格式:gpasswd [选项]... 用户名 组名 常用命令选项 -A:定义组管理成员列表 -a:添加组成员,每次只能加一个 -d:删除组成员,每次只能删一个 -M:定义组成员用户列表,可
用户8360274
2021/03/09
6260
用户组的管理
Linux用户及组管理
组:GID(逻辑容器,包含用户;实现多个用户对于某个文件或者应用程序分配相同的权限)
用户8826052
2021/07/12
2.4K0
Linux 用户和用户组管理命令
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户4988085
2021/07/19
3.3K0
Linux命令_用户和用户组管理
新增组的命令 groupadd 格式:groupadd [-g GID] groupname 如果不加-g选项,则按照系统默认的gid创建组。跟uid一样,gid也是从1000开始的。 我们也可以如下
Zoctopus
2018/06/04
1.9K0
Linux命令_用户和用户组管理
新增组的命令 groupadd 格式:groupadd [-g GID] groupname 如果不加-g选项,则按照系统默认的gid创建组。跟uid一样,gid也是从1000开始的。 我们也可以如下
Zoctopus
2018/06/20
1.8K0
用户账户安全-用户组的管理
用户账户是用来记录用户的用户名和口令、隶属的组、可以访问的网络资源,以及用户的个人文件和设置。每个用户都应在域控制器中有一个用户账户,才能访问服务器,使用网络上的资源。
用户7881870
2021/05/17
8990
Nagios 多用户权限管理- 特定用户访问特定主机或服务
1.nagios安装             ------------ 2.添加用户和密码 htpasswd /usr/local/nagios/etc/htpasswd.users eddy
星哥玩云
2022/07/14
1.3K0
Nagios 多用户权限管理- 特定用户访问特定主机或服务
点击加载更多

相似问题

无法创建Keycloak 17.0.0管理用户

28

在keycloak和spring中管理用户权限

11

将管理页面限制为仅限管理用户使用

11

为非管理用户启用管理面板

13

是否可以将用户管理员限制为仅管理某些组的用户?

115
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文