Разобрать список миссий и дат в dict миссий , ключами которых являются строковые значения дат: '2009-12-20' .Затем вы можете найти диктовку ( ', если дата в миссиях: ...' ).Вам также понадобится разобрать текстовую форму дат (с помощью регулярных выражений) в '2009-12-20' форму, я написал функцию 'dtuple_to_date ()'.(Вы можете использовать набор, а не dict, та же идея. Поиск типов отображения, таких как dicts или sets, является постоянным временем, т. Е. O (1), а не O (N) для списка из N элементов.)* Этот код работает:
import re
missions = """['Soyuz_TMA-16', '2009-09-30']
['Soyuz_TMA-17', '2009-12-20']
['Soyuz_TMA-01M', '2010-10-07']""".translate(None,',[]\'\"').split('\n')
missions = [t.split() for t in missions]
missions = dict((d,m) for m,d in missions)
input = """abcd 30th september 2009 skakk gkdka kkhhf Soyuz TMA 16.
gfigka Soyuz TMA 16 hfkhf hghhg fghh 30th september 2009.""".split('\n')
find_dates = re.compile(r'(\d+)\S*\s+(\S+)\s+(2008|2009|2010|2011)')
def dtuple_to_date(d,mth,y):
"""convert ('30','september','2009') to '2009-09-30"""
m = {'january':1,'february':2,'march':3,'april':4,'may':5,'june':6,
'july':7,'august':8,'september':9,'october':10,'november':11,
'december':12}[mth.lower()]
return "%s-%02d-%s" % (y,m,d)
for idx,line in enumerate(input):
for (day,mth,yr) in find_dates.findall(line):
date = dtuple_to_date(day,mth,yr)
#print 'Looking up', date
if date in missions:
print 'Line %d: reference to mission %s on date %s' \
% (idx, missions[date], date)