在Python中编辑列表元素

17 投票
6 回答
24494 浏览
提问于 2025-04-16 00:17

我该如何从列表中的一个元素中去掉一个字符呢?

举个例子:

mylist = ['12:01', '12:02']

我想把文件中的时间戳里的冒号去掉,这样我就能更方便地把它们转换成24小时制的时间。目前我正在尝试遍历列表中的元素,找出包含冒号的那些,然后进行替换。

for num in mylist:
    re.sub(':', '', num)

但是这样似乎不太奏效。

求助!

6 个回答

4
for i, num in enumerate(mylist):
    mylist[i] = num.replace(':','')

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

17

使用列表推导式来生成一个新的列表:

>>> mylist = ['12:01', '12:02']
>>> mylist = [s.replace(':', '') for s in mylist]
>>> print mylist
['1201', '1202']

你这个解决方案不行的原因是,re.sub会返回一个新的字符串——在Python中,字符串是不可变的,也就是说,re.sub不能直接修改你已有的字符串。

24

列表推导式的解决方案是最符合Python风格的,但这里有个重要的区别:

mylist[:] = [s.replace(':', '') for s in mylist]

如果你把值赋给mylist这个名字,就像其他答案那样,而不是赋给mylist[:]这个“整个列表切片”,我建议你这样做,你实际上是在做一件很不同的事情,而不是“替换列表中的条目”。你是在创建一个新列表,并且只是把之前用来指向旧列表的名字重新绑定到了这个新列表上。

如果旧列表被多个名字引用(包括在其他容器中的条目),这种重新绑定不会影响到那些名字。例如,如果你有一个函数,它把mylist作为参数,那么这个名字的赋值只在函数内部有效,并不会改变调用者看到的列表内容。

而如果你赋值给整个列表切片mylist[:] = ...,这就会改变列表对象,而不是仅仅在切换名字的绑定上搞些花样——这样列表就真的被改变了,无论用什么名字来引用,新的值都是能看到的。例如,如果你有一个函数,它把mylist作为参数,整个列表切片的赋值会改变调用者看到的列表内容。

关键是要清楚你想要达到什么效果——大多数情况下,你会想要改变列表对象,所以如果要猜的话,赋值给整个列表切片通常是最好的选择;-)。在性能方面,这两种方式没有区别(除了名字赋值如果同时保留了旧的和新的列表对象,会在这段时间内占用更多内存,这点是肯定的)。

撰写回答