在python中编辑列表中的元素
如何从列表中的元素中删除字符 例如:在python中编辑列表中的元素,python,regex,string,Python,Regex,String,如何从列表中的元素中删除字符 例如: mylist = ['12:01', '12:02'] 我想从文件中的时间戳中删除冒号,这样可以更轻松地将其转换为24小时时间。现在,我正在尝试循环列表中的元素,搜索包含冒号的元素并进行替换 for num in mylist: re.sub(':', '', num) 但这似乎不起作用 救命啊 使用生成新列表: >>> mylist = ['12:01', '12:02'] >>> mylist = [s.r
mylist = ['12:01', '12:02']
我想从文件中的时间戳中删除冒号,这样可以更轻松地将其转换为24小时时间。现在,我正在尝试循环列表中的元素,搜索包含冒号的元素并进行替换
for num in mylist:
re.sub(':', '', num)
但这似乎不起作用
救命啊 使用生成新列表:
>>> mylist = ['12:01', '12:02']
>>> mylist = [s.replace(':', '') for s in mylist]
>>> print mylist
['1201', '1202']
解决方案不起作用的原因是
re.sub
返回一个new字符串——字符串在Python中是不可变的,因此re.sub
无法修改现有字符串。必须将re.sub的返回插入列表中。下面是一个新的列表。但你也可以为mylist做这些
mylist = ['12:01', '12:02']
tolist = []
for num in mylist:
a = re.sub(':', '', num)
tolist.append(a)
print tolist
列表理解解决方案是最具魔力的解决方案,但有一个重要的转折点:
mylist[:] = [s.replace(':', '') for s in mylist]
如果您像在另一个答案中一样,将barename指定给mylist
,而不是我建议的mylist[:]
,“整个列表片段”,那么您所做的事情与“替换列表中的条目”完全不同:您正在创建一个新列表,并重新绑定以前用于引用旧列表的barename
如果多个名称(包括容器中的条目)引用了该旧列表,则此重新绑定不会影响其中任何一个名称:例如,如果您有一个函数将mylist
作为参数,则barename赋值仅对该函数局部有任何影响,并且不会改变调用者所看到的列表内容
分配给整个列表片段,mylist[:]=…
,改变了列表对象,而不是切换barenames的绑定——现在列表已经真正改变了,无论如何引用,新的值就是所看到的。例如,如果有一个函数将mylist
作为参数,则整个列表片分配会改变调用者所看到的列表内容
关键是要确切地知道您想要的是什么效果——最常见的情况是您需要更改list对象,因此,如果必须猜测,整个list切片分配通常是最好的猜测;-)。就性能而言,这两种方式都没有区别(除了barename赋值,如果它同时保留旧的和新的列表对象,那么这两个对象在任何时间段内都会占用更多内存)。python中的字符串是不可变的,这意味着任何函数都不能更改现有字符串的内容,仅提供一个新字符串。给你
有关可以更改的字符串类型的讨论,请参阅。但实际上,最好调整字符串的不变性。您也可以使用
map
调用来代替列表理解:
mylist = ['12:01', '12:02']
map(lambda f: f.replace(':', ''), mylist)
返回:
['1201', '1202']
它不起作用,因为字符串是不可变的
re.sub
实际上返回一个字符串,但您没有分配它。阅读文档:列出对救援的理解!对于循环的标准,列表理解有什么好处,或者仅仅是代码的可读性或长度吗?@TooAngel:它更棒;)@TooAngel:除了可读性和减少代码长度外,列表理解也执行得更快。@Daniel Stutzbach:不总是这样。这取决于您在列表理解中所做的操作(例如,如果您使用嵌套列表理解)。有时,使用普通的for
循环可以获得更高的性能。默认情况下,我会选择此解决方案,因为您将新字符串嵌套到同一个列表对象中。列表理解方法将结果与原始列表指针分离。当列表是复杂对象的属性,并且您希望该复杂对象具有更新的列表时,您必须将新列表分配回一个属性,这是非常不符合python的。
['1201', '1202']