1

のリストがdatetime.datesあり、各日付が翌月からのものかどうかを確認する必要があります。

コードから私が何を意味するのかが明確であることを願っています:

import datetime
from unittest import TestCase


def is_consecutive(dates):
    # TODO
    return


class DatesTestCase(TestCase):
    def test_consecutive(self):
        self.assertTrue(is_consecutive([datetime.date(2010, 10, 3),
                                        datetime.date(2010, 11, 8),
                                        datetime.date(2010, 12, 1),
                                        datetime.date(2011, 01, 11)]))

    def test_not_consecutive(self):
        self.assertFalse(is_consecutive([datetime.date(2010, 7, 6),
                                         datetime.date(2010, 8, 24),
                                         datetime.date(2010, 3, 5),
                                         datetime.date(2010, 10, 25)]))

        self.assertFalse(is_consecutive([datetime.date(2010, 10, 6),
                                         datetime.date(2010, 11, 2),
                                         datetime.date(2010, 12, 9),
                                         datetime.date(2010, 01, 20)]))

どのように実装しis_consecutiveますか?

助けてくれてありがとう(アドバイス、ヒント、コード、または役立つもの)!

4

3 に答える 3

2

これはあなたの例で機能し、一般的に機能するはずです:

def is_consecutive(data):
    dates=data[:]
    while len(dates)>1:
        d2=dates.pop().replace(day=1)
        d1=dates[-1].replace(day=1)
        d3=d1+datetime.timedelta(days=32)
        if d3.month!=d2.month or d3.year!=d2.year:
            return False        
    return True
于 2013-06-09T23:12:13.423 に答える
2

最後の項目を除くリストの各項目をループし、次の項目と比較します。2 番目の月が最初の月よりちょうど 1 大きい場合、または 2 番目の月が 1 で 2 番目の年が最初の年よりちょうど 1 大きい場合、2 つの項目は連続しています。False最初の失敗で戻り、それ以外の場合はTrue最後に戻ります。

編集: 2 番目のケースでは、2 番目の月が 1 であることに加えて、明らかに最初の月は 12 でなければなりません。コードが更新されました。

編集2:そして最初のケースでは、明らかに年は同じでなければなりません。それはあなたがあまりにも速く書くために得られるものです.

例:

#!/usr/bin/python

from datetime import date

def is_consecutive(datelist):
    for idx, my_date in enumerate(datelist[:-1]):
        if ((datelist[idx + 1].month - my_date.month == 1 and
             datelist[idx + 1].year == my_date.year) or
            (datelist[idx + 1].month == 1 and
             my_date.month == 12 and
             datelist[idx + 1].year - my_date.year == 1)):
            continue
        else:
            return False
    return True

print is_consecutive([date(2010, 10, 3),
                      date(2010, 11, 8),
                      date(2010, 12, 1),
                      date(2011, 1, 11)])

print is_consecutive([date(2010, 7, 6),
                      date(2010, 8, 24),
                      date(2010, 3, 5),
                      date(2010, 10, 25)])

別の実装で、従う方が簡単かもしれませんが、基本的に同じことを行います:

def is_consecutive(datelist):
    for idx, my_date in enumerate(datelist[:-1]):
        month_diff = datelist[idx + 1].month - my_date.month
        year_diff = datelist[idx + 1].year - my_date.year
        if ((month_diff == 1 and year_diff == 0) or
            (month_diff == -11 and year_diff == 1)):
            continue
        else:
            return False
    return True
于 2013-06-09T22:49:27.033 に答える
1

この問題の別の解決策を次に示します。

def is_consecutive(dates):
    months =  [date.month for date in sorted(dates)]  # extracting months from date, dates list has to be sorted first
    months_diff = [abs(x - months[i - 1]) for i, x in enumerate(months) if i>0]  # creates a resulting list of values after subtracting month with a previous month (absolute value is needed to account for the case when subtracting December(12) from January(1)
    if not(set(months_diff) - set([1,11])):  # if months_diff contains any values other than 11 and 1 then dates are not consecutive
         return True
    return False
于 2013-06-10T18:23:31.910 に答える