surepj 发表于 2021-12-2 10:35

【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

醉红尘0 发表于 2021-12-2 11:25

st_day = 20210101
en_day = 20991231
for i in range(st_day,en_day):
    if str(i) == str(i)[::-1]:
      print("%d是对称日期" % i)


提供一种更简单的方法,即通过判断字符串日期的倒序是否与原字符串相等

醉红尘0 发表于 2021-12-4 17:07

如果只是求某个范围内的回文数,直接用求字符串倒序的方式就足够了。
如果求的是某个时间范围的对称日期,建议使用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)

zqc8 发表于 2021-12-2 13:35

这不就是回文数吗?

surepj 发表于 2021-12-2 14:16

本帖最后由 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是对称日期
... ...

surepj 发表于 2021-12-2 14:17

zqc8 发表于 2021-12-2 13:35
这不就是回文数吗?

差不多是那个意思。

yueye121 发表于 2021-12-2 15:23

有bug啊{:17_1062:},只判断了月份<=12,没有判断日期<=30/31

surepj 发表于 2021-12-2 16:28

yueye121 发表于 2021-12-2 15:23
有bug啊,只判断了月份

有道理,{:1_893:}在19xx年份或之前,还有23xx年份或之后是有些问题的,哈哈。

Jaybo 发表于 2021-12-2 16:49

谢谢大佬分享,谢谢谢

halfone 发表于 2021-12-3 09:54

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 是对称日

surepj 发表于 2021-12-3 15:02

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
查看完整版本: 【Python】初学笔记-求对称的日期,20211202就是对称日期