我有一段在列表字典中搜索字符串列表的Python代码.它目前可以工作;但是我的代码遍历字典中的每个条目,然后try 找到与子列表匹配的列表.如果词典很大,我的代码就不会有效率.有没有更好/更有效的方法来做到这一点?

我的python代码如下:

from collections import defaultdict
import numpy as np
from bisect import bisect_left

def matchingStringsByKeys(dictionary, searchString):
        return [val for key, val in dictionary.items() if searchString in key]
    
def getsublist(firstArr, secondArr):
    
            # Maps elements of firstArr[]
            # to their respective indices
        mp = {}
    
        print('len(firstArr): %s' % str(len(firstArr)))
            # Traverse the array firstArr[]
    
        for i in range(len(firstArr)):
                mp[firstArr[i]] = i + 1
    
            # Stores the indices of common elements
            # between firstArr[] and secondArr[]
        tempArr = []
    
            # Traverse the array secondArr[]
        for i in range(len(secondArr)):                
            returned_keys = matchingStringsByKeys(mp, secondArr[i])
            if (len(returned_keys) > 0):
                print('Match found for: %s' % secondArr[i])
                for k in returned_keys:
                    tempArr.append(k)
    
        tail = []
        tempArrLen = len(tempArr)
        if ( tempArrLen > 0):
                    # Stores lIS from tempArr[]
            tail.append(tempArr[0])
            for i in range(1, len(tempArr)):
                if (tempArr[i] > tail[-1]):
                    tail.append(tempArr[i])
                elif (tempArr[i] < tail[0]):                                
                    tail.insert(0, tempArr[i])
                else :
                    it = bisect_left(tail, tempArr[i])
                    tail.insert(it, tempArr[i])
        else:
            print('Did not find a match')                
    
        return tail
    
    
#keyword_list = ['men', 'boy']
keyword_list = ['men', 'boy', 'dog']
#db_data={'male':['man', 'men'], 'child':['boy','lad', 'girl'], 'animal':['cat','dog']}

db_data={'male':['1:man', '2:men'], 'child':['3:boy','4:lad', '5:girl'], 'animal':['6:cat','7:dog, puppy']}


output = defaultdict(list)
for key, value in db_data.items():
    print('\nchecking in: %s\n ' % (value))
    a = np.array(value)
    b = a.ravel()
    result = getsublist(b, keyword_list)
    print('Result: %s' % (result))
    for x in result:
        output[key].append(b[x-1])
    
print(output)

推荐答案

我建议使用倒数db_data,那么搜索就会很容易:

inv_db = {}
for k, v in db_data.items():
    for vv in v:
        inv_db.setdefault(vv, []).append(k)

# inv_db is now:

{
    "man": ["male"],
    "men": ["male"],
    "boy": ["child"],
    "lad": ["child"],
    "girl": ["child"],
    "cat": ["animal"],
    "dog": ["animal"],
}

然后:

keyword_list = ["men", "boy"]

out = {}
for k in keyword_list:
    for v in inv_db.get(k, []):
        out.setdefault(v, []).append(k)

print(out)

打印:

{'male': ['men'], 'child': ['boy']}

Python-3.x相关问答推荐

如何翻转以列形式给出的日期间隔并提取多个重叠时段内每小时的音量?

Pandas—在特定列上比较两行双框,并根据特定条件保留其中一行?

如何在输入正确的用户名和密码时添加按钮?

Django内置注销视图`不允许的方法(GET):/USERS/LOGOUT/`

Heroku 中的未知错误代码缺少一个或多个参数

tkinter/python3.9 中的 Entry 子类和用户输入重复的问题

attrs 将 list[str] 转换为 list[float]

如何在 Python 中 cv2 的窗口标题上动态更新 FPS

删除Pandas 数据框行不起作用

使用正则表达式捕获组解析地址

使用 from re findall 组合连续匹配并分离非连续匹配

魔术8球txt文件列表

将字节数组转换为类似字节的对象?

在 Python 3 中使用 unittest.mock 修补 input()

使用打印时,用+连接是否比用,分隔更有效?

迭代dict值

为什么等效的 Python 代码要慢得多

在不关心项目的情况下运行生成器功能的更简单方法

tkinter TclError:错误的文件类型使用 askopenfilename

如何正确创建自定义文本编解码器?