【问题标题】:How do you change a list of integers and strings into a list of integers and floats in python?如何在 python 中将整数和字符串列表更改为整数和浮点数列表?
【发布时间】:2011-07-22 15:58:24
【问题描述】:

我有一长串列表:

[0, ['0.2000', '0.2000', '3.0000', '0.5000']]

如何使“...”浮动并保持整数 (0) 整数?

我试过 numpy,但它对我不起作用 numpy.array(list, numpy.float)

我不介意整数是否也是浮点数。

【问题讨论】:

  • 您能否提供一个稍微大一点的数据集示例?你的列表嵌套有多深?
  • 另外,我猜整数和列表是交错的,就像你的例子一样?

标签: python string list


【解决方案1】:

我会这样做:

newlist = [[element[0], [float(e) for e in element[1]] for element in oldlist]

element[0] 是保持原样的整数,element[1] 是在内部列表推导中转换为浮点数的字符串列表。

【讨论】:

    【解决方案2】:

    我需要查看更多数据才能确定这是否合适,但这个可能会接近:

    l1 = [0, ['0.2000', '0.2000', '3.0000', '0.5000']]
    l2 = [x if type(x) is int else map(float, x) for x in l1]
    

    同样,需要查看更多关于您的实际数据以确定这是否有效。以上返回:

    [0, [0.20000000000000001, 0.20000000000000001, 3.0, 0.5]]
    

    【讨论】:

      【解决方案3】:

      简单

      li = [0, ['0.2000', '0.2000', '3.0000', '0.5000']]
      print li
      
      li[1] = map(float,li[1])
      print li
      

      编辑 1

      如果 xyze 是:

      xyze = [[0, ['0.2000', '0.2000', '3.000' , '0.5000']],
              [9, ['0.1450', '0.8880', '3.000' , '0.4780']],
              [4, ['5.0025', '7.2000', '12.00' , '6.5013']]]
      

      print '\n'.join(map(str,xyze))
      print
      
      for el in xyze:
          el[1] = map(float,el[1])
      
      print '\n'.join(map(str,xyze))
      

      结果

      [0, ['0.2000', '0.2000', '3.000', '0.5000']]
      [9, ['0.1450', '0.8880', '3.000', '0.4780']]
      [4, ['5.0025', '7.2000', '12.00', '6.5013']]
      
      [0, [0.2, 0.2, 3.0, 0.5]]
      [9, [0.145, 0.888, 3.0, 0.478]]
      [4, [5.0025, 7.2, 12.0, 6.5013]]
      

      【讨论】:

      • 等等,什么?所以当你说你有一个“长列表”时,你实际上是指你有一个列表,它的第二项是一个列表就是这样?我们其他人认为这只是一个简短的例子
      • @ Rob :我有一个数据集超过 6000 组 [0, ['0.2000', '0.2000', '3.000' , '0.5000'] 但它们像 [[0, ['0.2000', '0.2000', '3.000' , '0.5000'],[0, ['0.2000', '0.2000', '3.000' ,'0.5000'],[0, ['0.2000', '0.2000' , '3.000' , '0.5000'], ...] 但我通过一个循环遍历所有这些
      • 对于 xrange 中的 pnum(len(xyze)):xyze[pnums][1] = map(float,xyze[pnums][1])
      • @George 啊,这不是我理解你的问题的方式。我的答案不是你需要的。
      【解决方案4】:

      以下是使用 numpy 的方法:

      In [96]: l1=[0, ['0.2000', '0.2000', '3.0000', '0.5000']]
      
      In [97]: l2=np.array(tuple(l1),dtype=[('f1','int'),('f2','float',4)])
      
      In [98]: l2
      Out[98]: 
      array((0, [0.20000000000000001, 0.20000000000000001, 3.0, 0.5]), 
            dtype=[('f1', '<i4'), ('f2', '<f8', 4)])
      

      如果您的实际列表看起来更像这样:

      In [99]: l3=[0, ['0.2000', '0.2000', '3.0000', '0.5000'], 1, ['.1','.2','.3','0.4']]
      

      然后您可以使用 grouper 成语 zip(*[iter(l3)]*2)) 将每 2 个元素分组为一个元组:

      In [104]: zip(*[iter(l3)]*2)
      Out[104]: [(0, ['0.2000', '0.2000', '3.0000', '0.5000']), (1, ['.1', '.2', '.3', '0.4'])]
      

      并将其传递给np.array:

      In [105]: l4=np.array(zip(*[iter(l3)]*2),dtype=[('f1','int'),('f2','float',4)])
      
      In [106]: l4
      Out[106]: 
      array([(0, [0.20000000000000001, 0.20000000000000001, 3.0, 0.5]),
             (1, [0.10000000000000001, 0.20000000000000001, 0.29999999999999999, 0.40000000000000002])], 
            dtype=[('f1', '<i4'), ('f2', '<f8', 4)])
      

      【讨论】:

        【解决方案5】:

        如果您也想展平嵌套列表...

        import types
        
        def process(l):
            for item in l:
                if isinstance(item, types.ListType):
                    for item in process(item):
                        yield float(item)
                else:
                    yield float(item)
        
        >>> l = [0, 1, 2, [3, 4, '5.000'], ['6.01', 7, [8, 9]]]
        >>> list( process(l) )
        [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.01, 7.0, 8.0, 9.0]
        

        【讨论】:

        • 鉴于有关该问题的新的附加信息,此答案回答了 OP 的问题。无论如何我都会留下它,因为它是扁平化嵌套列表的一种简洁(恕我直言)方式
        猜你喜欢
        • 2021-12-22
        • 1970-01-01
        • 2015-10-24
        • 2018-01-11
        • 2019-04-26
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多