Есть ли способ эффективно сравнить два списка dicts в python? - PullRequest
4 голосов
/ 15 сентября 2010

У меня есть два списка словарей.Первый список содержит определения сферы в терминах x, y, z, радиус .Второй список содержит различные точки в пространстве как x, y, z .Эти списки очень длинные, поэтому итерации по каждому списку и сравнение со всеми значениями неэффективны.

Я пробовал карту и сокращал термины, но оба они принимают только 1 термин в функции фильтрации.Я использую следующее:

      for curNode in nodeList:
            for i in sphereList:
                    tmpRad = findRadius(i, curNode)
                    if float(tmpRad) <= float(i['radius']):
                            print "Remove node", curNode['num']
                            nodeRemovalList.append(curNode['num'])
                            break

, где i - текущая сфера (x, y, z, rad), а curNode - узел (num, x, y, z).Для больших списков это становится очень неэффективным.Я хотел бы отфильтровать узлы, которые попадают в радиус любой сферы.

Ответы [ 3 ]

4 голосов
/ 15 сентября 2010

попробуйте это:

def in_sphere(node):
    return any(float(findRadius(sphere, node)) <= float(sphere['radius']) 
               for sphere in sphereList)

nodeRemovalList = filter(in_sphere, nodeList)

Это будет работать намного быстрее, чем код, который вы отобразили.

это предполагает, что вы на самом деле хотите nodeRemovalList и что это не просто промежуточный шаг. Если это просто промежуточный шаг, верните not any(, и результатом `filter будет желаемый набор.

Кроме того, почему sphere['radius'] уже не является поплавком? это немного ускорило бы процесс в действительно огромном списке.

3 голосов
/ 15 сентября 2010

Возможно, вы захотите взглянуть на что-то вроде пространственные октреи , чтобы уменьшить количество сфер, по которым вы должны проверять каждую точку.

2 голосов
/ 15 сентября 2010

Вы пытаетесь определить, какие точки попадают в сферу.Использование матричного подхода в numpy может быть проще, поскольку вы можете эффективно сделать трехмерный вектор расстояния для всех точек, пусть p = point (x1, y1, z1)Пусть A - массивы сферных центров, тогда массивы векторов расстояний могут быть компьютерными и сравниваться с массивами радиусов в numpy.Вы найдете матричные операции быстрее, чем итерации.

...