忽略或回避名称错误

Ignore or sidestep a name error

我觉得我在这里把小题大做变成了大山,但我想不出或不知道有更好的方法来做到这一点。

简而言之,我有一个列表列表,如下所示:

[ [4.54323, 5.4325], [7.235, 3.67543], [9.342543, 1.65323] ]

并且我需要一个如下所示的列表:

[ {lat: 4.54323, lng: 5.4325}, {lat: 7.235, lng: 3.67543}, {lat: 9.342543, lng: 1.65323} ]

我做了一些我并不引以为豪的事情,结果是:

[ '{lat: 4.54323, lng: 5.4325}', '{lat: 7.235, lng: 3.67543}', '{lat: 9.342543, lng: 1.65323}' ]

是的,一些字符串操作,现在我卡住了 一个字符串列表。然后我尝试评估所述列表中的每个元素,但不出所料地得到了 NameError: name 'lat' is not defined.

所以这更像是一个由多个部分组成的问题。有没有一种方法可以在不将元素转换为字符串和替换字符的情况下获得我想要的内容?或者,我可以评估或将这些字符串转换为它们应该是的任何数据类型(我认为是集合)。此变量只会被发送到 HTML 文件以使用 Jinja 替换变量。所以其实并不需要被python理解,(我用的是2.7.x)。

编辑: 这是我正在使用的方法,由于工作原因,我正在积极尝试不共享那么多代码,抱歉。在该方法的生命周期中也进行了许多不同的尝试。所以有些台词可能看起来很奇怪。

evalledCoords = []

def make_points(coords):
if(coords):
    for x in range(0, len(coords)):
        # remove first element, not needed.
        coords[x].pop(0)
        coords[x] = str(coords[x]).replace("[", "{lat: ").replace(",", ", lng:").replace("]", "}")
        # See outputs
        print '\n', coords[x]
        print 'evalled coords', evalledCoords.append(eval(coords[x]))
return coords

如果你想解决 "i have this and i want this" 可以简单地用 map

来完成
>>> a = [ [4.54323, 5.4325], [7.235, 3.67543], [9.342543, 1.65323] ]
>>> map(lambda x: {'lat': x[0], 'lng': x[1]}, a)
[{'lat': 4.54323, 'lng': 5.4325}, {'lat': 7.235, 'lng': 3.67543}, {'lat': 9.342543, 'lng': 1.65323}]

更新

让你的功能发挥作用

def make_points(coords):
    return map(lambda x: {'lat': x[0], 'lng': x[1]}, coords)

根据提供的数据结构和您希望实现的预期输出,这可以通过对现有数据结构进行简单循环并创建新的字典列表来完成:

coords = [ [4.54323, 5.4325], [7.235, 3.67543], [9.342543, 1.65323] ]

new_list = []
for data in coords:
    new_list.append({
        'lat': data[0],
        'lng': data[1]
    })

print(new_list)
# [{'lng': 5.4325, 'lat': 4.54323}, {'lng': 3.67543, 'lat': 7.235}, {'lng': 1.65323, 'lat': 9.342543}]

或者,简单地作为列表理解:

new_list = [{'lat': d[0], 'lng': d[1]} for d in coords]

print(new_list)
# [{'lng': 5.4325, 'lat': 4.54323}, {'lng': 3.67543, 'lat': 7.235}, {'lng': 1.65323, 'lat': 9.342543}]

作为使用字典的替代方法,请考虑使用命名元组来存储您的位置数据。它们使用较少的 RAM,并且可以通过索引或属性访问组件。由于 namedtuples 是一种元组,它们是不可变的,但通常将地点的(纬度、经度)信息存储在不可变数据结构中是有意义的。 :)

这是一个简短的演示。

from collections import namedtuple

Pos = namedtuple('Pos', ('lat', 'lng'))

a = Pos(30, 150)
print(a)
print(a[0], a.lng)

coords = [ 
    [4.54323, 5.4325],
    [7.235, 3.67543],
    [9.342543, 1.65323],
]

locations = [Pos(*u) for u in coords]
print(locations)

输出

Pos(lat=30, lng=150)
30 150
[Pos(lat=4.54323, lng=5.4325), Pos(lat=7.235, lng=3.67543), Pos(lat=9.342543, lng=1.65323)]