【问题标题】:Editing elements in a list in python在python中编辑列表中的元素
【发布时间】:2011-03-06 21:32:49
【问题描述】:

如何从列表中的元素中删除字符?

例子:

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

我想从文件的时间戳中删除冒号,以便更轻松地将它们转换为 24 小时制。现在我正在尝试遍历列表中的元素并搜索包含冒号的元素并进行替换。

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

但这似乎不起作用。

救命!

【问题讨论】:

标签: python regex string


【解决方案1】:

您也可以使用map 调用来代替列表解析:

mylist = ['12:01', '12:02']
map(lambda f: f.replace(':', ''), mylist) 

返回:

['1201', '1202']

【讨论】:

    【解决方案2】:

    python 中的字符串是不可变的,这意味着没有函数可以更改现有字符串的内容,只能提供一个新字符串。这里是why

    有关可以更改的字符串类型的讨论,请参阅here。但在实践中,最好适应字符串的不变性。

    【讨论】:

      【解决方案3】:

      列表理解解决方案是最 Pythonic 的解决方案,但是,有一个重要的转折点:

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

      如果您分配给mylist,就像在另一个答案中一样,而不是分配给mylist[:],“整个列表切片”,正如我所建议的那样,您确实在做一些与“替换”非常不同的事情条目在列表中”:您正在创建一个新列表并重新绑定您之前用来引用旧列表的裸名。

      如果该旧列表被多个名称(包括容器中的条目)引用,则此重新绑定不会影响其中的任何一个:例如,如果您有一个以 mylist 作为参数的函数,那么裸名称赋值仅对函数的本地有任何影响,并且不会改变调用者所看到的列表内容。

      分配给整个列表切片,mylist[:] = ...改变列表对象,而不是胡乱切换barenames的绑定——现在这个列表已经真正改变了,不管它是如何被引用的to,新的价值就是所见即所得。例如,如果您有一个将mylist 作为参数的函数,则整个列表切片分配会改变调用者所看到的列表内容。

      关键是确切地知道你想要什么效果——最常见的是你会想要改变列表对象,所以,如果必须猜测,整个列表切片分配通常是最好的猜测; -)。就性能而言,这两种方式都没有区别(当然,如果裸名分配同时保留旧列表对象和新列表对象,那么无论这两个对象仍然存在多少时间,都会占用更多内存)。

      【讨论】:

        【解决方案4】:

        您必须将 re.sub 的返回值插入到列表中。下面是一个新列表。但是你也可以对 mylist 这样做。

        mylist = ['12:01', '12:02']
        tolist = []
        for num in mylist:
          a = re.sub(':', '', num)
          tolist.append(a)
        
        print tolist
        

        【讨论】:

          【解决方案5】:

          使用list comprehension 生成新列表:

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

          您的解决方案不起作用的原因是 re.sub 返回一个 new 字符串——字符串在 Python 中是不可变的,因此 re.sub 无法修改您现有的字符串。

          【讨论】:

          • 列表理解救援!
          • 列表推导对标准 for 循环有什么好处,或者仅仅是代码的可读性或长度?
          • @TooAngel: 更厉害 ;)
          • @TooAngel:除了可读性和减少代码长度之外,列表推导式的执行速度也更快。
          • @Daniel Stutzbach:并非总是如此。这取决于您在列表推导中所做的事情(例如,如果您使用嵌套列表推导)。有时您可以使用普通的for 循环获得更多性能。
          【解决方案6】:
          for i, num in enumerate(mylist):
              mylist[i] = num.replace(':','')
          

          【讨论】:

          • 默认情况下,我会选择这个解决方案,因为您将新字符串重新嵌套到同一个列表对象中。列表理解方法将结果与原始列表指针分离。当列表是复杂对象的属性,并且您希望该复杂对象具有更新的列表时,您必须将新列表分配回一个属性,这是非常不符合 Python 的。
          猜你喜欢
          • 1970-01-01
          • 2015-03-05
          • 1970-01-01
          • 2020-08-13
          • 2020-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-01
          相关资源
          最近更新 更多