【问题标题】:Shortening list objects to only digits and creating new list in Python将列表对象缩短为仅数字并在 Python 中创建新列表
【发布时间】:2018-12-04 17:01:08
【问题描述】:

我有一个列表,其中包含几百个日期,但我只需要过滤掉 hhmmss 格式的时间(没有 : 介于两者之间,以便稍后将它们转换为 int)。

到目前为止我的列表如下所示:

list_dates = ['Fri Nov 30 15:56:43 +0000 2018', 'Fri Nov 30 15:56:44 +0000 2018', 'Fri Nov 30 15:56:45 +0000 2018', 'Fri Nov 30 15:56:46 +0000 2018', ... ]

到目前为止,我的方法是:

raw_list = []
new_list = []

def ConversionStrings():

    j = 0
    while j < (len(list_dates)+1):

        for j in list_dates:

            raw_list.append((list_dates[j])[11:19])
            j += 1

    i = 0
    while i < len(raw_list):

        for i in raw_list:
            item = (raw_list[i]).replace(":", "")
            new_list.append(item)
            i += 1

显然这不起作用,但我不知道我做错了什么,因为我对 Python 还很陌生。我得到的错误是this,它指的是for循环中的j

 TypeError: list indices must be integers or slices, not str

如何更改我的代码以获得此输出?或者有没有更简单的方法来解决这个问题?

 >>> new_list = [155643, 155644, 155645, ... ]

【问题讨论】:

    标签: python list for-loop


    【解决方案1】:

    您的问题在于这部分代码:

    j = 0
    while j < (len(list_dates)+1):
    
        for j in list_dates:
    
            raw_list.append((list_dates[j])[11:19])
            j += 1
    

    list_dates 中的每个j 都是数组的一个元素,而不是某个元素的索引。因此,当您尝试使用list_dates[j] 获取list_datesjth 元素时,您将传入str 作为数组的索引,这没有任何意义。您应该像在外部循环中那样使用另一个 while 循环,或者使用 for k in range(len(list_dates)) 或类似的东西。

    【讨论】:

      【解决方案2】:

      而不是晦涩

      j = 0
      while j < (len(list_dates)+1):
      
          for j in list_dates:
      
              raw_list.append((list_dates[j])[11:19])
              j += 1
      

      使用 Pythonic(更简单、更易读、更安全的方式)

      for item in list_dates:
          raw_list.append(item[11:19])
      

      一样
      i = 0
      while i < len(raw_list):
      
          for i in raw_list:
              item = (raw_list[i]).replace(":", "")
              new_list.append(item)
              i += 1
      

      我。 e.替换为

      for item in raw_list:
          item = item.replace(":", "")
          new_list.append(item)
      

      【讨论】:

        【解决方案3】:

        你可以使用list comprehension:

        list_dates = ['Fri Nov 30 15:56:43 +0000 2018', 'Fri Nov 30 15:56:44 +0000 2018', 'Fri Nov 30 15:56:45 +0000 2018', 'Fri Nov 30 15:56:46 +0000 2018']
        result = [''.join(c for c in date.split()[3] if c.isnumeric())  for date in list_dates]
        print(result)
        

        输出

        ['155643', '155644', '155645', '155646']
        

        如果您希望结果为整数,请使用int:

        result = [int(''.join(c for c in date.split()[3] if c.isnumeric())) for date in list_dates]
        print(result)
        

        输出

        [155643, 155644, 155645, 155646]
        

        【讨论】:

          【解决方案4】:

          使用datetime 模块你可以做这样的事情。进一步阅读链接https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

          from datetime import datetime
          [datetime.strftime(datetime.strptime(i,'%a %b %d %H:%M:%S +0000 %Y'),'%H%M%S') for i in list_dates]
          

          输出:

          ['155643', '155644', '155645', '155646']
          

          如果您需要转换 int 中的值,然后将它们转换为列表推导本身以获取 int 值列表

          【讨论】:

            猜你喜欢
            • 2022-11-05
            • 2010-09-25
            • 2019-08-12
            • 2013-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多