将字符串解析为dicts列表

时间:2014-05-21 13:40:01

标签: python parsing python-2.7 data-structures string-parsing

我有一个看起来像这样的字符串:

POLYGON ((148210.445767647 172418.761192525, 148183.930888667 172366.054787545, 148183.866770629 172365.316772032, 148184.328078148 172364.737139913, 148220.543522168 172344.042601933, 148221.383518338 172343.971823159), (148221.97916844 172344.568316375, 148244.61381946 172406.651932395, 148244.578100039 172407.422441673, 148244.004662562 172407.938319453, 148211.669446582 172419.255646473, 148210.631989339 172419.018894911, 148210.445767647 172418.761192525))

我可以轻松地从字符串中删除POLYGON以关注数字,但我有点想知道将这个字符串解析为字典列表的最简单/最好的方法是什么。

第一个括号(在POLYGON之后)表示可以提供多个元素(用逗号,分隔)。

所以每对数字应该是xy

我想解析这个字符串,最后得到以下数据结构(使用python 2.7):

list [ //list of polygons
  list [ //polygon n°1
    dict { //polygon n°1's first point
      'x': 148210.445767647, //first number
      'y': 172418.761192525 //second number
    },
    dict { //polygon n°1's second point
      'x': 148183.930888667,
      'y': 148183.930888667
    },
    ... // rest of polygon n°1's points
  ], //end of polygon n°1
  list [ // polygon n°2
    dict { // polygon n°2's first point
      'x': 148221.9791684,
      'y': 172344.568316375
    },
    ... // rest of polygon n°2's points
  ] // end of polygon n°2
] // end of list of polygons

多边形的点数实际上是无限的 每个点的数字用空格分隔。

您是否知道以循环或任何递归方式执行此操作的方法?

PS:我是一个蟒蛇初学者(只有几个月的时间),所以不要犹豫,详细解释。谢谢!

3 个答案:

答案 0 :(得分:2)

您定义Polygon对象的数据结构与python元组声明非常相似。一个选项,虽然有点hacky将是使用python的AST parser

您必须剥离POLYGON部件,此解决方案可能不适用于其他更复杂的声明。

import ast
your_str = "POLYGON (...)"
# may be better to use a regex to split off the class part 
# if you have different types
data = ast.literal_eval(your_str.replace("POLYGON ",""))
x, y = data
#now you can zip the two x and y pairs together or make them into a dictionary

答案 1 :(得分:1)

假设你有一个看起来像这样的字符串

my_str =“POLYGON((148210.445767647 172418.761192525,148183.930888667 172366.054787545,148183.866770629 172365.316772032,148184.328078148 172364.737139913,148220.543522168 172344.042601933,148221.383518338 172343.971823159),(148221.97916844 172344.568316375,148244.61381946 172406.651932395,148244.578100039 172407.422441673,148244.004662562 172407.938319453,148211.669446582 172419.255646473,148210.631989339 172419.018894911,148210.445767647 172418.761192525) )'

my_str = my_str.replace('POLYGON ', '')
coords_groups = my_str.split('), (')

for coords in coords_groups:
    coords.replace('(', '').replace(')', '')
    coords_list = coords.split(', ')
    coords_list2 = []
    for item in coords_list:
        item_split = item.split(' ')
        coords_list2.append({'x', item_split[0], 'y': item_split[1]})

我认为这应该有所帮助

现在你需要的是一种在括号之间获取信息的方法,这应该有助于Regular expression to return text between parenthesis

更新更新上面的代码感谢https://stackoverflow.com/users/2635860/mccakici的另一个答案,但只有当你在问题中说明你有字符串结构时这才有效

答案 2 :(得分:1)

你可以试试吗?

import ast

POLYGON = '((148210.445767647 172418.761192525, 148183.930888667 172366.054787545, 148183.866770629 172365.316772032, 148184.328078148 172364.737139913, 148220.543522168 172344.042601933, 148221.383518338 172343.971823159), (148221.97916844 172344.568316375, 148244.61381946 172406.651932395, 148244.578100039 172407.422441673, 148244.004662562 172407.938319453, 148211.669446582 172419.255646473, 148210.631989339 172419.018894911, 148210.445767647 172418.761192525))'
new_polygon = '(' + POLYGON.replace(', ', '),(').replace(' ', ',') + ')'


data = ast.literal_eval(new_polygon)
result_list = list()
for items in data:
    sub_list = list()
    for item in items:
        sub_list.append({
            'x': item[0],
            'y': item[1]
        })
    result_list.append(sub_list)

print result_list