Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何遍历元组字典?_Python_Python 2.7_Datetime_Dictionary_Tuples - Fatal编程技术网

Python 如何遍历元组字典?

Python 如何遍历元组字典?,python,python-2.7,datetime,dictionary,tuples,Python,Python 2.7,Datetime,Dictionary,Tuples,我将以下元组月、日存储在字典季节: seasons = { 'S1': ( ((1, 10),(5, 31)) ), 'S2': ( ((9, 1),(1, 9)) ), 'S3': ( ((6, 1),(9, 30)) ) } 我想检查datetimedt位于哪个日期间隔,并相应地分配名称S1、S2或S3 我试着这样做,但是start和end似乎是数字而不是元组 def getSeason

我将以下元组
月、日
存储在字典
季节

seasons = {
    'S1': (
        ((1, 10),(5, 31))
    ),
    'S2': (
        ((9, 1),(1, 9))
    ),
    'S3': (
        ((6, 1),(9, 30))
    )
}
我想检查datetime
dt
位于哪个日期间隔,并相应地分配名称
S1
S2
S3

我试着这样做,但是
start
end
似乎是数字而不是元组

    def getSeason(dt):
        season = None    
        for t, ranges in seasons.items():
            for start, end in ranges:
                if date(dt.year,start(0),start(1)) <= dt.date() <= date(dt.year,end(0),end(1)):
                    season = t
                    break
            if season is not None:
                break
        return season
def getseasure(dt):
季节=无
对于t,范围以季节为单位。项()
对于开始,在范围内结束:

如果日期(dt.year,start(0),start(1))很少出现问题,我可以看到您的代码-

  • 您似乎假设您有一个tuple of tuple of tuple,但实际上您有一个tuple of tupe,因为当您尝试创建一个元素的tuple时,需要在元素后面加一个
    ,否则python会将其解释为用于分组的括号。范例-

    a = ((1,2),)
    
    简单来说

    a = (1,)
    
  • 其次,在访问元组值时,应该使用
    start[0]
    ,而不是
    start(0)
    ,因为后者试图将其作为函数调用,并将
    0
    作为参数

  • 你的逻辑不考虑赛季开始是一年的情况,而赛季结束是在下一年。

    所以季节看起来是这样的-

    seasons = {
        'S1': (
            ((1, 10),(5, 31)),
        ),
        'S2': (
            ((9, 1),(1, 9)),
        ),
        'S3': (
            ((6, 1),(9, 30)),
        )
    }
    
    对原始的
    getSeason()
    函数进行一个小的更改,以使您的案例生效-

    def getSeason(dt):
        season = None    
        for t, ranges in seasons.items():
            for start, end in ranges:
                if start[0] <= end[0] or (start[0] == end[0] and start[1] <= end[1]):
                    if date(dt.year,start[0],start[1]) <= dt.date() <= date(dt.year,end[0],end[1]):
                        season = t
                        break
                else:
                    if (date(dt.year,start[0],start[1]) <= dt.date() <= date(dt.year+1,end[0],end[1])) or (date(dt.year-1,start[0],start[1]) <= dt.date() <= date(dt.year,end[0],end[1])):
                        season = t
                        break
            if season is not None:
                break
        return season
    
    def getseasure(dt):
    季节=无
    对于t,范围以季节为单位。项()
    对于开始,在范围内结束:
    
    如果start[0]则主要问题是您正在解包元组,因此将
    int
    放入
    start
    end
    。如果删除嵌套循环,代码将按预期工作:

    from datetime import datetime
    
    seasons = {
        'S1': (
            (1, 10), (5, 31),
        ),
        'S2': (
            (9, 1), (1, 9),
        ),
        'S3': (
            (6, 1), (9, 30),
        )
    }
    
    
    def getSeason(dt):
        for t, (start, end) in seasons.iteritems():
            if start[0] < end[0] and datetime(dt.year, start[0], start[1]) <= dt <= datetime(dt.year, end[0], end[1]):
                return t
    
            elif (start[0] > end[0] and
                      (datetime(dt.year, start[0], start[1]) <= dt <= datetime(dt.year + 1, end[0], end[1]) or
                       datetime(dt.year - 1, start[0], start[1]) <= dt <= datetime(dt.year, end[0], end[1]))):
                return t
    
            else:
                continue
    
        return None
    
    从日期时间导入日期时间
    季节={
    ‘S1’:(
    (1, 10), (5, 31),
    ),
    “S2”:(
    (9, 1), (1, 9),
    ),
    ‘S3’:(
    (6, 1), (9, 30),
    )
    }
    季节(dt):
    对于t,(开始,结束)在季节中。iteritems():
    如果start[0]
    
    from datetime import date
    
    seasons = {
        'S1': (
            ((1, 10),(5, 31))
        ),
        'S2': (
            ((9, 1),(1, 9))
        ),
        'S3': (
            ((6, 1),(9, 30))
        )
    }
    
    def getSeason(dt):
        for sname, duration in seasons.items():
            start, end = duration
            start_date = date(dt.year, start[0], start[1])
            end_date = date(dt.year, end[0], end[1])
            if dt < start_date:
                start_date = date(start_date.year - 1, start_date.month, start_date.day)
                end_date = date(end_date.year - 1, end_date.month, end_date.day)
            if end_date < start_date:
                end_date = date(end_date.year+1, end_date.month, end_date.day)
            if start_date <= dt <= end_date:
                return sname
        return None
    
    if __name__ == '__main__':
        s = getSeason(date(1921, 5, 24))
        print s
    
    from datetime导入日期
    季节={
    ‘S1’:(
    ((1, 10),(5, 31))
    ),
    “S2”:(
    ((9, 1),(1, 9))
    ),
    ‘S3’:(
    ((6, 1),(9, 30))
    )
    }
    季节(dt):
    对于sname,以季节为单位的持续时间。项()
    开始,结束=持续时间
    开始日期=日期(日期年,开始[0],开始[1])
    结束日期=日期(日期年,结束[0],结束[1])
    如果dt<开始日期:
    开始日期=日期(开始日期.year-1,开始日期.month,开始日期.day)
    结束日期=日期(结束日期.年-1,结束日期.月,结束日期.日)
    如果结束日期<开始日期:
    结束日期=日期(结束日期.年+1,结束日期.月,结束日期.日)
    
    如果没有年份,开始日期就毫无意义。你也应该存储年份。@StevenRumbalski,OP只是检查给定日期是否在一个季节内(秋天、春天等)。这不需要一年。如果OP包含年份,那么使用datetime.date将是一个好主意。@StevenRumbalski:我知道如何处理日期。在我的情况下,我需要(月,日)对没有年。嗯,我知道我应该解决的任务…@Digoraius:如果你的数据不需要几年,它可能不应该重叠<代码>'S3'
    (9,30)
    结尾<代码>'S2'
    (9,1)
    开始。除非在两个季节同时放置某个东西是有效的,否则你的标准是无效的。如果您依靠迭代顺序来授予某一季的特权,那么使用Python字典将不会对您有所帮助,因为迭代顺序不必遵循定义顺序。@Digoraius:您的数据表明不是这样。这就是问题所在。错误:
    getSeason(datetime.datetime(2017,12,31))
    getSeason(datetime.datetime(2017,1,1))
    每次返回
    None
    。歧义:
    getSeason(datetime.datetime(2017,9,1))
    返回
    'S3'
    当它很可能返回
    'S2'
    @StevenRumbalski时,该错误出现在季节的字典定义中,因为存在重叠值,并且没有涵盖一年中的所有日子。我添加了一个更正确的dict以避免最初的输入问题。一个季节可以跨越一年边界是合理的。我认为不应该被定义掉。@StevenRumbalski你对前两个是正确的,但是没有什么可以做的,因为这是他的季节定义中固有的模糊性(我认为这是一个拼写错误,S2从10月1日开始,而不是9月1日)。错误:
    getSeason(日期(1921,12,31))
    getSeason(日期(1921,1))
    每次返回
    None
    。您当然是对的,我可能误解了这个问题是关于迭代,而不是关于日期算法。