создать список словаря в Pythoni c способ - PullRequest
0 голосов
/ 24 января 2020

Я хотел создать список словаря со случайными переменными

Я знаю, как создать этот словарь с базовым c python кодом, но мне больше интересно узнать, есть ли более быстрый и еще Pythoni c способ достижения этого, поскольку я должен создать это для более чем 10000 случайных переменных

Примечание: Размер списка такой же, как # случайных величин

мои случайные величины:

lat_lon = [(42.35,-121.73),(35.67,-71.19),(38.17,-74.83)]
id = [1,2,3]

Структура словаря:

{ origin_lat : 42.67
  origin_lon : -122.67
  id: 2
}

Ожидаемый результат с использованием указанных выше случайных величин:

[
{ origin_lat : 42.35,
  origin_lon : -121.73
  id: 1
},
{ origin_lat : 35.67
  origin_lon : -71.19
  id: 2
},
{ origin_lat : 38.17
  origin_lon : -74.83
  id: 3
}

Мой код:

lst = []
for lat_lon, id in zip(lat_lon,id):
   lst.append(
      { origin_lat : lat_lon[0]
        origin_lon : lat_lon[1]
        id: id
      }
             )

Ответы [ 3 ]

3 голосов
/ 24 января 2020

Чуть более приятный (и немного более быстрый) код полностью распаковывается под полезными именами (распаковка может распаковывать вложенные последовательности, если они все имеют известную длину), например:

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 метода .

0 голосов
/ 24 января 2020

Вот пример без zip, как было запрошено в комментариях.

lat_lon = [(42.35,-121.73),(35.67,-71.19),(38.17,-74.83)]
id_ = [1,2,3]


output = []
for i in range(len(id_)):
    output.append(dict(id=id_[i], origin_lat=lat_lon[i][0], origin_lon=lat_lon[i][1]))
print(output)

Вы можете попробовать это на glot.io здесь.

Это должно быть O (n). Предполагается, что id_ и lat_lon имеют одинаковую длину.

len - это O (1), а range не должен создавать структуру в Python 3.0 +

@ ответ Шибираджа имеет похожий код, но с генераторами - что еще лучше!

0 голосов
/ 24 января 2020

Если проблема связана с памятью, вы можете использовать генераторы ,

lat_lon = [(42.35,-121.73),(35.67,-71.19),(38.17,-74.83)]
id = [1,2,3]
def get_dict():
    for i in range(len(lat_lon)):
        yield {'origin_lat': lat_lon[i][0], 'origin_lon': lat_lon[i][1], 'id': id[i]}
print(*get_dict(), sep='\n')

Альтернативные методы

result [{'origin_lat': lat_lon[i][0], 'origin_lon': lat_lon[i][1], 'id': id[i]} for i in range(len(lat_lon))] 

ИЛИ Используя zip со списком понимание,

result = [{'origin_lat': i[0][0], 'origin_lon': i[0][1], 'id': i[1]} for i in zip(lat_lon, id)]
result

вывод

[{'origin_lat': 42.35, 'origin_lon': -121.73, 'id': 1},
 {'origin_lat': 35.67, 'origin_lon': -71.19, 'id': 2},
 {'origin_lat': 38.17, 'origin_lon': -74.83, 'id': 3}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...