【问题标题】:Python: elegant and code saving way to split an string in a listPython:在列表中拆分字符串的优雅且节省代码的方法
【发布时间】:2012-12-06 17:40:18
【问题描述】:

我有一个字符串:

mydata
'POINT (558750.3267372231900000 6361788.0628051758000000)'

我希望有一种节省代码的方法来将列表中的数字转换为

(g, (x,y)) 

地点:

g = geometry (POINT)
x = coordinates x
y = coordinates y

我正在使用

mydata.split(" ")
['POINT', '(558750.3267372231900000', '6361788.0628051758000000)']

但之后我需要使用几行代码来获取 x 和 y

【问题讨论】:

标签: python list optimization coding-style


【解决方案1】:

一步一步:

>>> s = 'POINT (558750.3267372231900000 6361788.0628051758000000)'
>>> word, points = s.split(None, 1)
>>> word
'POINT'
>>> points
'(558750.3267372231900000 6361788.0628051758000000)'
>>> points = points.strip('()').split()
>>> points
['558750.3267372231900000', '6361788.0628051758000000']
>>> x, y = (float(i) for i in points)
>>> x
558750.3267372232
>>> y
6361788.062805176

【讨论】:

    【解决方案2】:

    Regex 可以省去你在这里打字的时间:

    In [1]: import re
    
    In [2]: def nice_tuple(s):                                                    
        g, x, y, _ = re.split(' ?[()]?', s)
        return g, tuple(map(float, (x, y)))
       ...: 
    
    In [3]: nice_tuple('POINT (558750.3267372231900000 6361788.0628051758000000)')
    Out[3]: ('POINT', (558750.3267372232, 6361788.062805176))
    

    【讨论】:

      【解决方案3】:

      如果您的数据始终采用这种精确格式,那很容易:

      >>> def parse_data(d):
          geom, xs, ys = d.split()
          return (geom, (float(xs[1:]), float(ys[:-1])))
      
      >>> mydata
      'POINT (558750.3267372231900000 6361788.0628051758000000)'
      >>> parse_data(mydata)
      ('POINT', (558750.32673722319, 6361788.0628051758))
      

      【讨论】:

        【解决方案4】:

        使用regex:

        In [59]: g,[x,y]=re.findall(r"[A-Za-z]+",mydata)[0],
                               [float(x) for x in re.findall(r"[\d+.]+",mydata)]
        
        In [60]: g
        Out[60]: 'POINT'
        
        In [61]: x
        Out[61]: 558750.3267372232
        
        In [62]: y
        Out[62]: 6361788.062805176
        

        使用str.strip()str.split()

        In [35]: mydata='POINT (558750.3267372231900000 6361788.0628051758000000)'
        
        In [39]: data=mydata.split(None,1)
        
        In [40]: data
        Out[40]: ['POINT', '(558750.3267372231900000 6361788.0628051758000000)']
        
        In [41]: g,[x,y]=data[0], map(lambda x: float(x.strip("()")), data[1].split())
        
        In [42]: g,x,y
        Out[42]: ('POINT', 558750.3267372232, 6361788.062805176)
        

        【讨论】:

          【解决方案5】:

          我会使用.translate.split

          In [126]: mydata = 'POINT (558750.3267372231900000 6361788.0628051758000000)'
          
          In [127]: mysplitdata = mydata.translate(None, '()').split()
          
          In [128]: mysplitdata
          Out[128]: ['POINT', '558750.3267372231900000', '6361788.0628051758000000']
          
          In [129]: g,x,y = mysplitdata[0],float(mysplitdata[1]),float(mysplitdata[2])
          
          In [130]: outdata = (g, (x,y))
          
          In [131]: outdata
          Out[131]: ('POINT', (558750.32673722319, 6361788.0628051758))
          

          【讨论】:

            【解决方案6】:

            最近我在 python 中创建了一个应用程序,我做了几乎相同的事情。这是我为解析 wkt 文件而创建的一个类。

            link

            希望你觉得它有用。有关用法,请参见第 136 行。你也可以使用这个类来读取 Linestrings 和 Multilinestrings。

            【讨论】:

              【解决方案7】:
              found = re.match(r'([a-zA-Z]*) \(([0-9\.]*) ([0-9\.]*)\)', mydata)
              found.group(1), (float(found.group(2)), float(found.group(3)))
              

              那可能是最短的,不知道优雅。

              【讨论】:

              • 您仍然需要将xy 转换为float
              【解决方案8】:
              v = mydata.split()
              g = v[0]
              x = float(v[1].strip('('))
              y = float(v[2].strip(')'))
              (g, (x, y))
              

              节省代码是的,没那么优雅

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-11-06
                • 2012-10-02
                • 1970-01-01
                • 2012-03-25
                • 2012-11-09
                • 1970-01-01
                • 2011-05-02
                • 2011-11-15
                相关资源
                最近更新 更多