0

リストには2つのリストがあります。1つには2つの日付とID番号が含まれ、もう1つにはID番号と日付を含む多くの情報が含まれています。その日付が各ID番号の他の2つの日付の間にあるかどうかを確認する必要があります。その場合は、新しいリストに書き込みます。より簡単に言えば、ID番号ごとに、日付が他の2つの日付の間にある場合は、その情報を新しいリストに書き込みます。現在、すべてのリストが新しいリストに追加されていますが、これは誤りです(すべての日付が他の2つの間にあるわけではありません)。

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からの日付が間になければならない2つの日付です。

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

ループが実行されるたびに、date [2]、date [0]、date [1]がすべて日付ペアの同じリストから取得されていないか、ID番号に問題が発生している可能性があります。これが特に明確でない場合は申し訳ありません。ご協力いただきありがとうございます!

編集: これが私が日付を日時オブジェクトに変換する方法です。これは上記のコードの直前に行われます。

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)
4

2 に答える 2

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の言うことは重要なので、代わりに日付をdatetimesオブジェクトとして保存する必要があります。これは、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リストのすべての情報を追加する必要があるかもしれませんが、それは辞書に簡単に追加できます。

于 2012-07-17T15:46:10.060 に答える
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)

次に、「visitinmv」ループが機能するはずです

于 2012-07-17T15:51:18.403 に答える