我有一个看起来像这样的字符串:
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之后)表示可以提供多个元素(用逗号,
分隔)。
所以每对数字应该是x
和y
。
我想解析这个字符串,最后得到以下数据结构(使用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:我是一个蟒蛇初学者(只有几个月的时间),所以不要犹豫,详细解释。谢谢!答案 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