【问题标题】:parsing a python string with floats and ints用浮点数和整数解析 python 字符串
【发布时间】:2013-02-27 05:19:25
【问题描述】:

我有数百个字符串都具有相同的格式——2 个整数后跟三个浮点数。一个例子:

1 10 1.2345 5.4321 10.5647

我只想将这些字符串一个接一个地解析为它们各自的整数和浮点数。我可以想出几种方法来做到这一点,但我希望 python 能有一些优雅的东西,有点类似于 str.format 用于写作的东西。这似乎是非常基本的功能,所以如果我问的问题已经得到回答,我很抱歉,但我在任何地方都找不到解决方案。有什么想法吗?谢谢。

【问题讨论】:

  • 我组织的防火墙阻止了该站点。
  • 嘿,他们不希望你太努力,我猜?它的开头是:“如果您是开发人员,并且您要向其他开发人员询问技术问题(在论坛、电子邮件、聊天频道或亲自),您最好准备好回答这个问题“你试过什么?””

标签: python parsing floating-point int


【解决方案1】:

一个简单的列表理解就可以解决问题

>>> mystr = '1 10 1.2345 5.4321 10.5647'
>>> [int(s) if s.isdigit() else float(s) for s in mystr.split()]
[1, 10, 1.2345, 5.4321, 10.5647]

【讨论】:

  • 这会将负整数转换为浮点数。可能这不是问题,但ast.literal_eval 会避免它。
【解决方案2】:

我认为你最好使用像 numpy 的 genfromtxtloadtxt 这样的东西:

import numpy as np
import StringIO

s = """1 10 1.2345 5.4321 10.5647
       2 14 434.35 345.34 1000000
       3 8  253.235 2.53 .002345"""
f = StringIO.StringIO(s)

data = np.genfromtxt(f, names = 'id, count, x, y, z', dtype=[int,int,float,float,float])

这给了你这些东西的数组,所以第一行可以访问

data[0]
#(1, 10, 1.2345, 5.4321, 10.5647)

或所有第二列:

data['count']
#array([10, 14,  8])

顺便说一句,这会将浮点列中的整数转换为浮点数,以防您的浮点数恰好是整数。

【讨论】:

    【解决方案3】:

    你可以这样做:

    def linep(line):
        line=line.split()
        try:
            ints=map(int, line[0:2])
            floats=map(float, line[2:5])
        except ValueError as e:
            print e
        return ints+floats
    
    print linep('1 10 1.2345 5.4321 10.5647')  
    

    那就这样用吧:

    >>> s='''1 10 1.2345 5.4321 10.5647
     -2 11 -0.5 0.5 .3'''
    >>> for line in s.splitlines():
    ...     print linep(line)
    

    打印:

    [1, 10, 1.2345, 5.4321, 10.5647]
    [-2, 11, -0.5, 0.5, 0.3]
    

    【讨论】:

    • 谢谢。类似的事情是我的选择之一。不过,我希望得到一些简短而甜蜜的东西,有点像反向格式化输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2021-06-30
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多