查找字符串的最佳匹配项

2024-04-30 12:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两本字典。在

mydict1 ={                                                                                           
    'Better' : {'vara1':'vala1', 'varb1':'valb1'},                                                                                   
    'BetterThanBest' : {'vara2':'vala2', 'varb2':'valb2'} }

mydict2 = {                                                                                                                                                            
    '/check12/BetterThanBest':'/dir3/BetterThanBest' }                                                                                                                                                                

for i in mydict2 :                                                                                                                                                     
    for pattern in mydict1.keys() :                                                                                                                                    
        if pattern in i : 
           print pattern, i                                                                                                  
           # Do something for i, 
           # but don't want multiple matches to i, just the best 

这将返回:

^{pr2}$

我想找一个与我的dict1的键完全匹配,即在上面的例子中“BetterThanBest”。有可能吗?在

谢谢你的回复。在


Tags: infor字典patternbettermydict2vara1vara2
3条回答

您可以尝试使用startswithendswith来执行poor man锚定,但实际上,您可能希望使用regex或带有候选字符串标记化的完全相等性检查来完全匹配您想要的内容。或者使用一个有序的密钥库,根据superset>;subset>;subsubsubset组织搜索词,然后在第一次查找时跳出搜索例程。做一些假设:

pattern_dict = {'Better' : {'vara1':'vala1', 'varb1':'valb1'},                                                                                   
                'BetterThanBest' : {'vara2':'vala2', 'varb2':'valb2'}}
candidate_dict = {'/check12/BetterThanBest':'/dir3/BetterThanBest' } 
for candidate, candidate_value in candidate_dict.iteritems():
    try:
        match_pattern = pattern_dict[candidate.rsplit('/', 1)[-1]]
    except KeyError:
        pass
    else:
        # do stuff for each matched candidate and it's matched pattern dict
In [43]: mydict1 ={                                                                                           
   ....:     'Better' : {'vara1':'vala1', 'varb1':'valb1'},                                                                                   
   ....:     'BetterThanBest' : {'vara2':'vala2', 'varb2':'valb2'} }

In [44]: mydict2 = {                                                                                                                                                            
   ....:     '/check12/BetterThanBest':'/dir3/BetterThanBest' }

In [51]: keys1=sorted(list(mydict1),key=len,reverse=True) #sort the keys by length, descending order

In [52]: keys2=sorted(list(mydict2),key=len,reverse=True) #sort the keys by length, descending order

In [54]: [x for x in keys1 for y in keys2 if x in y][0]
Out[54]: 'BetterThanBest'

恐怕您的需求对我来说不是很清楚,但是假设您要做的是将mydict1的键与mydict2中的最后一个单词相匹配(其中/是单词分隔符),下面是我如何处理它。在

d2_keys = dict((k.rsplit('/', 1)[-1], k) for k in mydict2)
for k in my_dict1:
  if k in d2:
    print k, d2[k]

它的作用是:

  1. 首先,我们创建一个新的dict d1,它将从mydict2的每个键提取的单词映射到原始值。这使我们能够快速地将关键字与提取的单词进行比较,并将其映射到原始值。在

    >>> d2 = dict((k.rsplit('/', 1)[-1], k) for k in mydict2)
    >>> d2
    {'BetterThanBest': '/check12/BetterThanBest'}
    
  2. 接下来我们迭代mydict1的键,并将这些键与d2进行比较。

注意:如果mydict2中的键产生了重复的单词,那么这将按预期工作。在

相关问题 更多 >