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))
)
}
我想检查datetimedt
位于哪个日期间隔,并相应地分配名称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
。您当然是对的,我可能误解了这个问题是关于迭代,而不是关于日期算法。