在Python中编辑列表元素
我该如何从列表中的一个元素中去掉一个字符呢?
举个例子:
mylist = ['12:01', '12:02']
我想把文件中的时间戳里的冒号去掉,这样我就能更方便地把它们转换成24小时制的时间。目前我正在尝试遍历列表中的元素,找出包含冒号的那些,然后进行替换。
for num in mylist:
re.sub(':', '', num)
但是这样似乎不太奏效。
求助!
6 个回答
for i, num in enumerate(mylist):
mylist[i] = num.replace(':','')
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。
使用列表推导式来生成一个新的列表:
>>> mylist = ['12:01', '12:02']
>>> mylist = [s.replace(':', '') for s in mylist]
>>> print mylist
['1201', '1202']
你这个解决方案不行的原因是,re.sub
会返回一个新的字符串——在Python中,字符串是不可变的,也就是说,re.sub
不能直接修改你已有的字符串。
列表推导式的解决方案是最符合Python风格的,但这里有个重要的区别:
mylist[:] = [s.replace(':', '') for s in mylist]
如果你把值赋给mylist
这个名字,就像其他答案那样,而不是赋给mylist[:]
这个“整个列表切片”,我建议你这样做,你实际上是在做一件很不同的事情,而不是“替换列表中的条目”。你是在创建一个新列表,并且只是把之前用来指向旧列表的名字重新绑定到了这个新列表上。
如果旧列表被多个名字引用(包括在其他容器中的条目),这种重新绑定不会影响到那些名字。例如,如果你有一个函数,它把mylist
作为参数,那么这个名字的赋值只在函数内部有效,并不会改变调用者看到的列表内容。
而如果你赋值给整个列表切片mylist[:] = ...
,这就会改变列表对象,而不是仅仅在切换名字的绑定上搞些花样——这样列表就真的被改变了,无论用什么名字来引用,新的值都是能看到的。例如,如果你有一个函数,它把mylist
作为参数,整个列表切片的赋值会改变调用者看到的列表内容。
关键是要清楚你想要达到什么效果——大多数情况下,你会想要改变列表对象,所以如果要猜的话,赋值给整个列表切片通常是最好的选择;-)。在性能方面,这两种方式没有区别(除了名字赋值如果同时保留了旧的和新的列表对象,会在这段时间内占用更多内存,这点是肯定的)。