Чуть более приятный (и немного более быстрый) код полностью распаковывается под полезными именами (распаковка может распаковывать вложенные последовательности, если они все имеют известную длину), например:
for (lat, lon), id in zip(lat_lon, id):
lst.append({'origin_lat': lat, 'origin_lon': lon, 'id': id})
Примечание: I ' d рекомендуем изменить имя последовательности id
на ids
или т.п .; использование того же имени для переменной итерации в какой-то момент укусит вас, даже если в этом случае это сработает. Точно так же lat_lon
звучит как одно значение; для коллекции, приумножьте имя (даже если распаковка означает, что мы не используем его повторно).
Конечно, еще лучше отказаться от dict
эмулирующих объектов и просто создать полезный класс для вашего данные; если вам не нужна изменчивость, использование collections.namedtuple
/ typing.NamedTuple
сгенерирует большую часть кода для вас, в то время как для изменяемых данных вы можете использовать a dataclass
. Для примера первого:
from collections import namedtuple
MapPoint = namedtuple('MapPoint', ['origin_lat', 'origin_lon', 'id'])
lst = [MapPoint(lat, lon, id) for (lat, lon), id in zip(lat_lon, id)]
Это также сэкономит нетривиальный объем памяти; в моей CPython 3.8 x64 установке три ключа dict
требуют 232 байта служебной информации (игнорируя стоимость фактических объектов ключ / значение), тогда как эквивалент namedtuple
потребляет только 64 байта. Доступ отличается (вы используете obj.origin_lat
вместо obj['origin_lat']
), но namedtuple
s можно легко преобразовать обратно в dict
по мере необходимости с помощью _asdict
метода .