我有两个列表列表,一个包含两个日期和一个ID号,另一个包含许多信息,包括ID号和日期。我需要查找该日期是否在每个ID号的其他两个日期之间,如果是,请将其写入新列表。更简单地说,对于每个id号,如果日期在其他两个日期之间,则将信息写入新列表。目前,所有列表都被放入新列表中,这是错误的(并非所有日期都在其他两个之间)。
mv = [['05/13/2012', '09:54:27', 'U', '#0F', '0006E3DADA', 'T', 'Un\n', 'F3', '13 05 12'],
['05/13/2012', '09:54:28', 'U', '#0F', '0006E3DADA', 'T', 'Un\n', 'F3', '13 05 12'],
etc]
对于mv,它是我感兴趣的列表中的最后一个日期。
datepairs = [['21 05 01', '04 06 01', 'C1'],
['27 07 06', '10 08 06', 'C1'],
etc]
这两个日期是mv必须介于两者之间的日期。
visitsbetweendates=[]
for visit in mv:
for date in datepairs1:
if date[2]==visit[7]: #if the id number is the same in both lists
if date[0]<= visit[8] <= date[1]: #if the visit date is between the datepair dates
if visit not in visitsbetweendates: #if the list is unique
visitsbetweendates.append(visit)
break
我认为可能发生的事情是,每次循环运行时,日期[2],日期[0]和日期[1]都不是来自日期对中的相同列表,或者ID号出错了。 对不起,如果这不是特别清楚的话。谢谢你的帮助!
修改 这是我如何将日期转换为datetime对象,这是在上面的代码之前完成的。
from datetime import datetime
for v in mv:
e=datetime.strptime(visit[0],'%m/%d/%Y')
s=e.strftime('%d %m %y')
visit.append(s)
datepairs1=[]
for date in datepairs:
d=datetime.strptime(str(date[0]),' %d %b %y')
f=datetime.strptime(str(date[1]),' %d %B %Y')
e=d.strftime('%d %m %y')
g=f.strftime('%d %m %y')
gah=[e,g,date[2].strip(' ')]
datepairs1.append(gah)
答案 0 :(得分:1)
首先,我将两个列表都转换为字典,这样可以提高代码的效率,因为每次开始搜索不同的密钥时都不必再遍历datepairs1列表,所以这就是我要做的:
首先将它们转换为词典:
between_dates = dict([(d[2], (d[0], d[1])) for d in datepairs1])
second_dict = {}
for m in mv:
key = m[7]
second_dict.setdefault(key ,[]) # this creates the key with an empty list inside if it doesn't exists yet
second_dict[key].append((m[0], m[8]))
将结束如下语法:
between_dates = {'C1': ('21 05 01', '04 06 01'), ....}
second_dict = {'C1': [('05/13/2012', '13 05 12'), ('05/13/2012', '13 05 12')]}
在两个列表中执行此操作将使搜索更快更容易调试,现在@eumiro说的很重要,因此您应该将日期保存为日期时间对象,您可以使用datetime.strptime执行此操作。您可以在那里找到将字符串日期转换为日期时间对象的格式。即:datetime.strptime('02 06 2011', '%d %m %Y')
所以现在比较一下:
visits_between_dates=[]
for key, bd in between_dates.items():
if second_dict.get(key, None): # This will ask if the se
for sl in second_dict.values():
if not sl in visits_between_dates and bd[0]<= sl[1] <= bd[1]:
visitsbetweendates.append(sl)
也许您需要附加mv列表中的所有信息,但可以轻松添加到词典中。
答案 1 :(得分:1)
将日期预处理为可比较的相同格式
for n in range(0,len(datepairs)):
(d,m,y)=(datepairs[n][1]).split(" ")
datepairs[n][1]="%d%s%s" % (2000+int(y),m,d)
(d,m,y)=(datepairs[n][0]).split(" ")
datepairs[n][0]="%d%s%s" % (2000+int(y),m,d)
for d in range(0,len(mv)):
(d,m,y)=(mv[n][0]).split("/")
mv[n][0]="%s%s%s",(y,m,d)
然后你的&#34;访问mv&#34;循环应该工作