Python 覆盖列表中的元素

Python 覆盖列表中的元素,python,Python,我正在创建一个返回时间的函数。我希望它显示am/pm,而不是最大24小时。所以我需要先减去小时数6,如果它大于12 但是什么都没有发生,我甚至没有得到一个错误,我不知道这是什么原因。有人能解释一下原因吗 导入日期时间 月数='一月二月三月四月五月六月七月八月九月十月十一月十二月'。上()拆分('') def get_date(): #1978年10月1日04:31:17 date=datetime.datetime.today() 日期[0]=日期[0]。拆分(“-”) 如果int(日期[1]。

我正在创建一个返回时间的函数。我希望它显示am/pm,而不是最大24小时。所以我需要先减去小时数6,如果它大于12

但是什么都没有发生,我甚至没有得到一个错误,我不知道这是什么原因。有人能解释一下原因吗

导入日期时间
月数='一月二月三月四月五月六月七月八月九月十月十一月十二月'。上()拆分('')
def get_date():
#1978年10月1日04:31:17
date=datetime.datetime.today()
日期[0]=日期[0]。拆分(“-”)
如果int(日期[1]。拆分(“:”)[0])>12:
日期[1]。拆分(“:”)[0]=str(int(日期[1]。拆分(“:”)[0])-12)
实际日期=日期[0][2]+'-'+月[int(日期[0][1])]+'-'+日期[0][0]+'+'+日期[1]。拆分('.')[0]
返回实际日期
打印(获取日期())
#2021年4月7日21:56:12

我建议将每个值拆分为变量。使用大量的列表索引和方法是可以的,但是使用变量而不是许多列表索引更具可读性

str_datetime=datetime.datetime.today()
(年、月、日),(h、m、s)=(str_datetime[0]。拆分('-'),str_datetime[1]。拆分(':'))
如果int(h)>12:
h=str(int(h)-12)
ampm=“PM”
其他:
ampm=“AM”
日期=f“{day}-{MONTHS[int(month)]}-{year}{h}:{m}:{round(float(s))}{ampm}”
这将给出以下值
date

'07-APR-2021 7:08:59 PM'

但是,您可以只使用
datetime.datetime.strftime()
方法,而不是使用如此冗长的方法。例如:

date=datetime.datetime.now().strftime(“%d-%b-%Y%I:%M:%S%p”)
这将提供以下输出:

'07-Mar-2021 18:56:37下午'

作为参考,这里是一个列表

对于您的问题,我建议一个全新的解决方案,更好地利用强大的
日期时间
模块

导入日期时间
date=datetime.datetime.today().strftime(“%Y-%m-%d%I:%m%p”)
打印(日期)
#“2021-03-08上午10:54”
代码无法工作的原因是您正在编辑一个未存储的临时变量。您必须创建一个变量来存储拆分列表,然后将它们连接回来

如果您将中间部分更改为

t=date[1]。拆分(“:”)
如果int(t[0])>12:
t[0]=str(int(t[0])-12)
日期[1]=':'。加入(t)

这会管用的。但我必须提醒你,这种方式将在附加
'AM'
'PM'
时产生更大的复杂性,而使用该模块将非常方便。

这种方法不起作用的原因基本上是基于这样一个问题,即
split
等方法返回一条新的数据,该数据是由其输入生成的,但在它被返回后不再与它链接;在代码的这一行中:

date[1]。拆分(':')[0]=str(int(date[1]。拆分(':')[0])-12)
举一些简单的例子:

s=“a:b:c”
l=s.split(“:”)#返回一个*新*列表“[“a”、“b”、“c”]`
s+=“:d”#“l”仍然是“[“a”,“b”,“c”]”,即使“s”现在是“a:b:c:d”`
l[0]=“e”#`s`仍然是`“a:b:c:d``,尽管``已更改为`[“e”、“b”、“c”]`
但是,您可以使用以下功能覆盖旧数据:在原始数据更改时,撤消
split
-
join
/重做操作:

s=“a:b:c”
l=s.split(“:”)#请注意,这实际上不会起任何作用,因为它将被向下两行覆盖
s+=“:d”#`s`现在是“a:b:c:d”`
l=s.split(“:”)#`l`现在是“[“a”、“b”、“c”、“d”]`
l[0]=“e”#`s`仍保持不变。。。
s=“:”.join(l)#但可以从更改的“l”进行更新,这样它现在将是“e:b:c:d”`

注意,当你考虑应用时实际上失去信息的函数时,它们没有被链接,比如<代码> LeN<代码>:

s=“abc”
len(s)=4#注意这是无效的语法;但如果是,现在应该是什么?


正如其他人所指出的,解决这一问题的最佳方法是将其替换为,因为这样做更容易、更简洁,更易于阅读,而且是“正确”的方式。

您使用的是没有时间部分的
datetime.datetime.today()
。我相信您希望使用
datetime.datetime.now()
。除了pavel已经提到的之外,您可能不希望操作日期和时间的字符串表示形式(另外,您可能应该通过调用
str
而不是核心对应的魔术方法来获取)。相反,在本例中,您实际上希望以不同的格式对其进行格式化,这是存在的。因为您询问了解决方案为什么不起作用:
split
返回一个新列表,该列表在
str
更改时不会更改(即使它是可变的),如果它更改,也不会更改
str
。相反,您必须获取列表,对其进行更改,然后将其重新连接起来,以获得包含更改内容的新字符串。这很好,但我想知道为什么我的方法不起作用。