解析任務和日期的列表轉換成字典任務,它的鍵是日期的字符串值:「2009-12-20」。 然後,你可以查找字典('如果在任務日期:...')。 你還需要能夠解析文本形式的日期(使用正則表達式)到'2009-12-20'窗體中,我寫了一個函數'dtuple_to_date()'。 (你可以使用一套而不是一個字典,相同的想法。查找映射類型像字典或集是恆定的時間,即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)
您嘗試過什麼嗎?如果沒有日期分析/強制,2009-09-30將與2009年9月30日相匹配,如果還有其他可能的格式,它會變得雜亂和緩慢。 –
歡迎來到Stack Overflow!你會發現,如果你試圖解決問題,其他人更能夠理解你的問題,並且更願意幫助你找到答案。 –
你可能應該刪除_array_標籤 - 你大概要麼是_dict_,要麼_sequence_,而不是_array_。 (_array_表示來自NumPy的數字類型數組。請參見[關於標準類型的文檔](http://docs.python.org/library/stdtypes.html)) – smci