【Python】初学笔记-求对称的日期,20211202就是对称日期
看到今天20211202,倒过来也是20211202,是为对称日,所以用Python也写了个求以后的对称日期,看样子以后要十年再遇一次了。date_start = 20211202
date_end = 20991231
for i in range(date_start,date_end):
b = str(i)
list1 = []
list1.extend(b)
list2 = list1.copy()
list2.reverse()
if list1 == list2:
c = int(list1)*10 + int(list1)
if c <= 12:
list1 = ''.join(list1)
print(f'{date_start}-{date_end}中对称的日期有:', list1)
运行如下:
20211202-20991231中对称的日期有: 20211202
20211202-20991231中对称的日期有: 20300302
20211202-20991231中对称的日期有: 20400402
20211202-20991231中对称的日期有: 20500502
20211202-20991231中对称的日期有: 20600602
20211202-20991231中对称的日期有: 20700702
20211202-20991231中对称的日期有: 20800802
20211202-20991231中对称的日期有: 20900902 st_day = 20210101
en_day = 20991231
for i in range(st_day,en_day):
if str(i) == str(i)[::-1]:
print("%d是对称日期" % i)
提供一种更简单的方法,即通过判断字符串日期的倒序是否与原字符串相等 如果只是求某个范围内的回文数,直接用求字符串倒序的方式就足够了。
如果求的是某个时间范围的对称日期,建议使用datatime模块对日期进行判断,手动判读月份还好,日的话还要判断大小月,还有二月的润年
示例代码:
# -*- coding: utf-8 -*-
import datetime
st_day = "2011-11-11"
en_day = "2099-11-11"
st_day_data = datetime.date(*map(int, st_day.split('-')))
en_day_data = datetime.date(*map(int, en_day.split('-')))
test_day_data = st_day_data
while test_day_data <= en_day_data:
test_day_str = str(test_day_data).replace('-','')
if str(test_day_str) == str(test_day_str)[::-1]:
print("%s是对称日期" % test_day_str)
test_day_data = test_day_data + datetime.timedelta(1)
这不就是回文数吗? 本帖最后由 surepj 于 2021-12-2 14:29 编辑
醉红尘0 发表于 2021-12-2 11:25
st_day = 20210101
en_day = 20991231
for i in range(st_day,en_day):
感谢分享,好像还有点问题,日期月份不能大于12没有考虑到:
20211202是对称日期
20222202是对称日期
20233202是对称日期
20244202是对称日期
20255202是对称日期
20266202是对称日期
20277202是对称日期
20288202是对称日期
... ... zqc8 发表于 2021-12-2 13:35
这不就是回文数吗?
差不多是那个意思。 有bug啊{:17_1062:},只判断了月份<=12,没有判断日期<=30/31 yueye121 发表于 2021-12-2 15:23
有bug啊,只判断了月份
有道理,{:1_893:}在19xx年份或之前,还有23xx年份或之后是有些问题的,哈哈。 谢谢大佬分享,谢谢谢 st_day = 20210101
end_day = 20991231
for i in range(st_day, end_day):
if (str(i) == str(i)[::-1]) and int(str(i)) < 13:
print('%d 是对称日' % i)
希望大佬可以进一步优化
输出结果:
20211202 是对称日
20300302 是对称日
20400402 是对称日
20500502 是对称日
20600602 是对称日
20700702 是对称日
20800802 是对称日
20900902 是对称日
halfone 发表于 2021-12-3 09:54
st_day = 20210101
end_day = 20991231
for i in range(st_day, end_day):
感谢分享!
在202101至20991231这段时间,你的代码是完全可以的。
但如果是19xx0101至23xx1231时间内,运行就有:
19900991 是对称日
...
23000032 是对称日
...
月份和日期还是会有点问题。
我在你基础上又优化了下:
st_day = 18000101
end_day = 23991231
for i in range(st_day, end_day):
if (str(i) == str(i)[::-1]) and 0 < int(str(i)) < 13 and int(str(i)) < 31:
print('%d 是对称日' % i)
页:
[1]
2