Я работаю над проблемой пространственного анализа, используя Python 2.7. У меня есть словарь edges
, представляющие ребра в виде графика, где ключ является edgeID и значение пуска/конечные точки:Ускорить поиск совпадений между двумя словарями (Python)
{e1: [(12.8254, 55.3880), (12.8343, 55.3920)],
e2: [(12.8254, 55.3880), (12.8235, 55.3857)],
e3: [(12.2432, 57.1120), (12.2426, 57.1122)]}
И у меня есть другой словарь nodes
, где ключ является NodeId и значение является узлом координаты:
{n14: (12.8254, 55.3880),
n15: (12.8340, 55.3883),
n16: (12.8235, 55.3857),
n17: (12.8343, 55.3920)}
Мне нужно, чтобы получить список, который будет выглядеть как (с «п» и «е» в ключах только для целей иллюстрации на этот вопрос, у меня есть целые там):
[(e1,n14,n17),(e2,n14,n16)..]
То есть, я перебираю по краям dict, беру каждую клавишу, нахожу значение, которое существует в типе nodes
и добавляю к кортежу. Это, как я делаю это сейчас:
edgesList = []
for featureId in edges:
edgeFeatureId = [k for k, v in edges.iteritems() if k == featureId][0]
edgeStartPoint = [k for k, v in nodes.iteritems() if v == edges[featureId][0]][0]#start point
edgeEndPoint = [k for k, v in nodes.iteritems() if v == edges[featureId][1]][0]#end point
edgesList.append((edgeFeatureId,edgeStartPoint,edgeEndPoint))
Это работает, но очень медленно при работе с большими наборами данных (с 100K краев и 90K узлами он занимает ки 10 минут).
Я понял, как использовать понимание списка при получении каждого из элементов кортежа, но можно ли получить мои 3-х списков в одном, чтобы избежать повторения ребер с помощью цикла for
(если это ускорит работу вверх)?
Есть ли другой способ построить такой список быстрее?
UPDATE
Как предположил Мартин, я перевернутой мои узлы Dict:
nodesDict = dict((v,k) for k,v in oldnodesDict.iteritems())
, имеющий узел координирует кортеж в качестве ключа и NodeId в качестве значения. К сожалению, это не ускорит процесс поиска (здесь обновленный код - я перевернул k
и v
для edgeStartPoint
и edgeEndPoint
):
edgesList = []
for featureId in edges:
edgeFeatureId = [k for k, v in edges.iteritems() if k == featureId][0]
edgeStartPoint = [v for k, v in nodes.iteritems() if k == edges[featureId][0]][0]#start point
edgeEndPoint = [v for k, v in nodes.iteritems() if k == edges[featureId][1]][0]#end point
edgesList.append((edgeFeatureId,edgeStartPoint,edgeEndPoint))
Не могли бы вы создать и объект, представляющий ребро? Вы можете перегрузить равную функцию или другую функцию, чтобы облегчить работу с этой структурой данных? – Marcin
@Marcin, вы имели в виду создание класса для объекта edge? Я надеялся, что смогу сделать какой-то умный словарь, но может найти что-нибудь подходящее. –
Да, класс Edge. Кажется, что он мог просто ваш код и операции на краях. – Marcin