【问题标题】:python: convert 2 dimension list of string to floatpython:将字符串的二维列表转换为浮点数
【发布时间】:2013-04-14 07:01:09
【问题描述】:

我有一个字符串类型的二维列表,我正在尝试将其转换为 int。到目前为止我尝试过的事情:

[[float(i) for i in lst[j] for j in lst]

带有for循环:

for i in range(len(lst)):
    for j in range(len(lst[i])):
         lst[i][j]=float(lst[i][j])

【问题讨论】:

  • 有两件事很突出:你的列表理解不平衡],所以它会出错。并且您正在尝试转换为 float,但您的问题是 int?
  • 您遇到了什么问题? for 循环解决方案有效
  • 在第一个解决方案中,循环的顺序不正确。在下面检查我的答案。

标签: python multidimensional-array


【解决方案1】:
>>> nums = [['4.58416458379', '3.40522046551', '1.68991195077'], ['3.61503670628', '5.64553650642', '1.39648965337'], ['8.02595866276', '8.42455003038', '7.93340754534']]
>>> [[float(y) for y in x] for x in nums]
[[4.58416458379, 3.40522046551, 1.68991195077], [3.61503670628, 5.64553650642, 1.39648965337], [8.02595866276, 8.42455003038, 7.93340754534]]

我不确定您的意图是什么,但由于您声称 for 循环版本不起作用,也许您想要一维结果,在这种情况下:

>>> [float(y) for x in nums for y in x]
[4.58416458379, 3.40522046551, 1.68991195077, 3.61503670628, 5.64553650642, 1.39648965337, 8.02595866276, 8.42455003038, 7.93340754534]

【讨论】:

  • 这应该包含在try/except 中,用于那些无法转换为浮点数的字符串。如果没有,至少检查一下以确保您没有传入空字符串。
  • @BurhanKhalid 谢谢,但我会留下评论,如有必要,OP 可以选择这样做。
【解决方案2】:

您的两个解决方案都接近工作。事实上,第二个应该已经可以工作了,尽管它可能会稍微改进一下。

以下是我更新列表理解版本的方法。这个版本的(也许是可疑的)优点是它创建了一个包含浮点数的新嵌套列表,并且保持原来的字符串嵌套列表不变(因此如果需要,您可以将其用于其他用途):

new_lst = [[float(string) for string in inner] for inner in lst]

以下是我更新您的 for 循环代码的方法。与使用列表推导的版本不同,此代码修改了原始列表列表的内容。虽然您当前的代码应该可以正常工作,但在我看来,下面的版本更“pythonic”,因为它迭代列表的内容,而不是迭代范围和索引列表。索引只需要赋值,我们使用enumerate内置函数获取索引和字符串:

for inner in lst:
    for index, string in enumerate(inner):
        inner[index] = float(string)

【讨论】:

    【解决方案3】:

    使用map(),这是一个简化的例子

    nums = [['4.58416458379','1.68991195077'], ['8.02595866276'],
        ['3.61503670628', '5.64553650642', '1.39648965337']]
    
    def myFloat(myList):
        return map(float, myList)
    
    map(myFloat, nums)
    

    【讨论】:

      【解决方案4】:
      newList = []
      listSize = len(oldList)
      for i in range(0, listSize):
          newList.append([])
          for j in range(0, 2):
              newList[i].append(float(oldData[i][j]))
      

      这对我有帮助,它创建了一个名为 newList 的新列表,并将 oldList 中的所有元素类型转换为 newList。虽然 newList 被初始化为一维数组,但第 4 行会根据要转换的数组的任何维度添加新维度。

      【讨论】:

      • 请在回答问题时添加一些解释。 “这对我有帮助”应该被替换。
      【解决方案5】:

      将您的第一个解决方案更正为:

      >>> sss = [['4.584','1.689'],['8.025'],['3.615','5.645','1.396']]
      >>> fff = [float(s) for ss in sss for s in ss]      #notice the order of loops
      >>> fff
      [4.584, 1.689, 8.025, 3.615, 5.645, 1.396]
      

      它有效。

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2016-07-09
        • 2020-04-05
        • 2020-05-20
        • 2022-11-20
        • 2015-10-20
        • 2011-11-25
        • 2017-12-06
        相关资源
        最近更新 更多