2015-04-30 2 views
2

Я все еще разбираюсь в словарях на Python. Можно ли ссылаться на ключ в dict dicts, используя либо регулярное выражение, либо функцию startswith?Python dict of dict Regex на клавишах

У меня есть диктофон dicts в следующем формате, и я пытаюсь выполнить общий поиск для «AreaOfInterest1», «AreaOfInterest2», «AreaOfInterest3» и т. Д. Я делаю его общим, поскольку затем ссылаюсь на связанное значение списка [ 0] для выполнения действий.

Мой ДИКТ из dicts будет выглядеть примерно так ...

FeatureDict = { 
    "MATCHcode96":{ 
    'ID':'MATCHcode96', 
    'AreaOfInterest1':['String 1','%',0], 
    'AreaOfInterest2':['String 2','Avg',[]], 
    'AreaOfInterest3':['String 3','Avg',[]], 
    }, 
    "MATCHcode9F":{ 
    'ID':'MATCHcode9F', 
    'AreaOfInterest1':['String 1','%',0], 
    'AreaOfInterest2':['String 2','Avg',[]], 
    }, 
} 

Вида функциональности я искал либо использовать StartsWith (как показано ниже), или в противном случае попробуйте регулярное выражение ..

for dict in FeatureDict: 
    if FeatureDict[dict]['ID'] in mypkt.Text:    
     if FeatureDict[dict][startswith.('AreaOfInterest')][0] in mypkt.Text: 
      print 'found' 

Спасибо.

+0

Я рекомендую использовать [ 'any'] (https://docs.python.org /3/library/functions.html#any) здесь. 'if any (FeatureDict [dict] [k] .startswith ('AreaOfInterest') и FeatureDict [dict] [k] [0] в mypkt.Text для k в FeatureDict [dict]): print 'found''. Отказ от ответственности: непроверенный. И недостатком использования любого является то, что вы не можете сохранить найденное вами значение, но это хорошо для простых «найденных» условностей. – Shashank

+0

О, и 'dict' не является хорошим именем переменной, потому что он затеняет встроенный тип с тем же именем. – Shashank

ответ

1

Нет, dict не поддерживает поисковые запросы, основанные на функциях ключевых или частичных совпадений ключа. dict поддерживает итерацию, поэтому вы можете сделать свой собственный поиск по цене O (n). (dict поиск обычно O (1)).

for outer_key, outer_val in FeatureDict.items(): 
    if outer_val['ID'] in mypkt.Text: 
     for inner_key, inner_val in outer_val: 
      if inner_key.startswith('AreaOfInterest') and inner_val in mypkt.Text: 
       print found 
       break 
1

Просто продолжайте перекручивание:

ids = ['MATCHcode9F'] 
area_ids = ['String 1'] 
for key in data: 
    if data[key]['ID'] in ids: 
     for inner_key in data[key]: 
      if inner_key.startswith('AreaOfInterest') and data[key][inner_key][0] in area_ids: 
       print('found') 

Так что ваш код будет выглядеть

for key in FeatureDict: 
    if FeatureDict[key]['ID'] in mypkt.Text: 
     for inner_key in FeatureDict[key]: 
      if inner_key.startswith('AreaOfInterest') and FeatureDict[key][inner_key][0] in mypkt.Text: 
       print 'found'