Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中编辑列表中的元素_Python_Regex_String - Fatal编程技术网

在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']