2012-12-06 2 views
2

У меня есть строка, как:Python: элегантный и сохранение способа разбить строку в списке код

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)'] 

, но после того, что мне нужно использовать несколько строк коды, чтобы получить экономии х и у

+0

Что нужно хранить в списке в виде точечных объектов, красиво предоставляет метод для анализа ваших точечных строк для вас http://pypi.python.org/pypi/Shapely – dm03514

ответ

1
v = mydata.split() 
g = v[0] 
x = float(v[1].strip('(')) 
y = float(v[2].strip(')')) 
(g, (x, y)) 

Кода да, шикарно не столько

1

с помощью 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) 
3

Шаг за шагом:

>>> 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 
3

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)) 
+0

Это изящно! – Tengis

2

Если ваши данные всегда в том, что точный формат, это легко:

>>> 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)) 
1
found = re.match(r'([a-zA-Z]*) \(([0-9\.]*) ([0-9\.]*)\)', mydata) 
found.group(1), (float(found.group(2)), float(found.group(3))) 

Это, наверное, самый короткий, не знаю об элегантности.

+0

Вам все равно придется конвертировать 'x' и' y' в 'float'. –

+0

Хорошо, я добавлю – Mark

1

Я хотел бы использовать .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)) 
1

Недавно я создал приложение в Python, где я сделал почти то же самое. Вот класс, который я создал для анализа файлов wkt.

link

Надеется, что вы найдете ее полезной. См. Номер строки 136 для использования. Вы можете использовать этот класс для чтения Linestrings и Multilinestrings.

Смежные вопросы