确保对于for循环的每次迭代,只从嵌套列表中使用一个列表

时间:2012-07-17 14:44:02

标签: python for-loop

我有两个列表列表,一个包含两个日期和一个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)

2 个答案:

答案 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;循环应该工作