-2

我有两本词典。

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 

这返回:

 Better /check12/BetterThanBest
 BetterThanBest /check12/BetterThanBest

我想找到 mydict1 的键的完全匹配,即在上述情况下为“BetterThanBest”。可能吗 ?

感谢您的任何回复。

4

4 回答 4

1
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'
于 2012-09-10T15:26:00.433 回答
0

startswith您可以尝试使用and进行穷人的锚定endswith,但实际上,您可能希望使用正则表达式或完全相等性检查以及候选字符串的标记化来完全匹配您想要的方式。或者使用有序的密钥库,根据超集>子集>子集组织您的搜索词,然后在第一次查找时打破搜索例程。做几个假设:

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
于 2012-09-10T15:15:38.873 回答
0

好的,我不知道为什么所有这些负面因素都指向这个问题,但我尝试了以下方法,它做了我想要的:

mydict1 ={                                                                                                                                                             
    'Better' : {'var1':'vala1', 'var2':'valb1'},                                                                                                                       
    'BetterThanBest' : {'var1':'vala2', 'var2':'valb2'}                                                                                                                
    }                                                                                                                                                                  
mydict2 = {                                                                                                                                                            
   '/check12/BetterThanBest':'/dir3/BetterThanBest'                                                                                                                   
   }                                                                                                                                                                  

for i in mydict2 :                                                                                                                                                     
    pat ='a'                                                                                                                                                           
    for pattern in mydict1.keys() :                                                                                                                                    
        if pattern in i and pattern.__len__() > pat.__len__():                                                                                                         
            pat = pattern                                                                                                                                              

    print pat
    print mydict1[pat]["var1"]                                                                                                                                         
于 2012-09-10T15:47:14.330 回答
0

恐怕您的要求对我来说不是很清楚,但是假设您要做的是将 的键与键中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. 首先,我们创建一个新的字典d1,它将从每个键中提取的单词映射mydict2到原始值。这使我们能够快速将键与提取的单词进行比较,并将其映射到原始值。

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

mydict2警告:如果输入的键导致重复的单词,这现在将按预期工作。

于 2012-09-10T15:25:41.397 回答