【问题标题】:Convert string with spaced out numbers into array将带有间隔数字的字符串转换为数组
【发布时间】:2015-12-02 12:37:10
【问题描述】:

我正在使用 Python,目前我有一个看起来像的列表

['001   2.4600       0.46  2.36E+003   86.66  16.77       0.33  1.32E+003   74.41  17.61       0.40  2.21E+003   87.39  22.07',
 '002   10.310       0.38  2.95E+002   76.88   4.53       0000  000000000   00000   0000       0.34  2.62E+002   97.36   4.41',
 '003   74.840       0.63  5.07E+002   64.63   4.03       0.57  4.15E+002   61.96   3.99       0.63  5.43E+002   64.67   5.16',
...

等等,还有更多的元素。列表的每个元素都是一个字符串,包含各种数字,它们之间有空格。即如上,第一个元素有001、2.4600、0.46等。

关键是我想把列表中的每个元素变成数组的一行。目的是拥有一个大型数组,为我提供所有信息,这些信息目前只是列表中字符串中由空格分隔的数字。

我确信我可以使用内置的数组模块来做到这一点,但我就是不知道怎么做。

有什么想法吗?希望问题很清楚。

【问题讨论】:

    标签: python arrays string


    【解决方案1】:

    假设您希望在最终列表中使用浮点数,请尝试以下操作:

    >>> data = ['001 2.4600 0.46 2.36E+003 86.66 16.77 0.33 1.32E+003 74.41 17.61 0.40 2.21E+003 87.39 22.07', '002 10.310 0.38 2.95E+002 76.88 4.53 0000 000000000 00000 0000 0.34 2.62E+002 97.36 4.41', '003 74.840 0.63 5.07E+002 64.63 4.03 0.57 4.15E+002 61.96 3.99 0.63 5.43E+002 64.67 5.16']
    
    >>> [list(map(float, row.split())) for row in data]
    [[1.0, 2.46, 0.46, 2360.0, 86.66, 16.77, 0.33, 1320.0, 74.41, 17.61, 0.4, 2210.0, 87.39, 22.07], [2.0, 10.31, 0.38, 295.0, 76.88, 4.53, 0.0, 0.0, 0.0, 0.0, 0.34, 262.0, 97.36, 4.41], [3.0, 74.84, 0.63, 507.0, 64.63, 4.03, 0.57, 415.0, 61.96, 3.99, 0.63, 543.0, 64.67, 5.16]]
    

    map 只是说“对这个列表中的所有内容执行这个函数 (float())(split() 的结果,它是一个字符串列表)”。在 Python 3 中它返回一个迭代器,所以我们必须请求它的 list()。使用 for 循环或列表推导通常比使用 map 更好,但在这种情况下它很方便。

    【讨论】:

      【解决方案2】:

      您使用array 模块的想法可能是错误的,作为array.array 对象is, essentially, a list with constrained data type。您不能对它们使用矢量化操作。此外,array.array 是一维对象。

      也就是说,您可能想要使用numpy module,其array 对象是一个多维数组,您可以随意对其进行操作。

      # idiomatic manner of importing numpy
      import numpy as np
      
      data = ['1 2 3.', '4. 5 8']
      arraydata = np.array([[float(n) for n in row.split()] for row in data])
      print arraydata
      
      # [[ 1.  2.  3.]
      #  [ 4.  5.  8.]]
      

      【讨论】:

      • 这看起来效果很好。唯一的小问题是,当我执行相当于“打印数组数据”的操作时,它会打印 2 个单独的数组(我想要),但都是 4 行 4 列,而不是 1 行 14 列。
      • 我猜你误解了数组的打印方式(每行 4 个数字)和数据的内部表示(按 14 个元素的行组织)。您可以通过打印数组的各个条目来检查我的意思,例如print arraydata[1,11],它为您提供260.0,即第二行中的第 12 个元素(请记住,Python 从零开始计数,第一个元素在寻址时二维数组是行数)。
      【解决方案3】:

      希望我理解正确

      res = []
      for row in my_list:
          res.append(list(map(float, row.split())))
      

      在这里,您将拥有一个字符串格式的值矩阵。添加转换

      【讨论】:

      • 我认为split(' ') 行不通。看起来 OP 的字符串要么有多个空格,要么有制表符而不是空格。相反,只需使用 split() 在任何空白字符处进行拆分。此外,您可以将其设为列表理解:res = [x.split() for x in lst]
      • 同意,我修改一下
      【解决方案4】:

      假设您的数据存储在一个名为 data 的列表中,您可以使用 data =[[int(el) for el in string.split(' ')] for string in data]

      【讨论】:

      • 这些看起来像整数吗?另外,最好使用split() 而不是split(' ')
      猜你喜欢
      • 2017-11-14
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2019-08-23
      • 1970-01-01
      • 2016-09-30
      • 2012-11-08
      相关资源
      最近更新 更多