Задача узнать количество элементов списка которые не удовлетворяют требованиям.
Например мы имеем 10 элементов списка, каждый из которых состоит из множества массивов.
Чтобы узнать количество “не совпадающих” элементов я каждый сравниваю с другими в списке:
1 с 2, 1 с 3, 1 с 4 … 1 с 10
2 с 3, 2 с 4 … 2 с 10
…
9 с 10
При 10 элементах в списке выходит 45 проверок, а если их будет 1000 ?
700 элементов проверяются 10 секунд, а хотелось бы чтобы было быстрее. Существуют ли способы сравнения элементов в списке оптимальным способом ?
кусок кода громоздкий …
from math import pow, sqrt, atan2
def distance2d(a, b):
return sqrt(pow((a[0]-b[0]),2)+pow((a[1]-b[1]),2))
def distance3d(a, b):
return sqrt(pow((a[0]-b[0]),2)+pow((a[1]-b[1]),2)+pow((a[2]-b[2]),2))
def normal(a, b, c):
return ((b[0]-a[0])*(c[1]-b[1])-(b[1]-a[1])*(c[0]-b[0]))
def dot(a, b):
return (a[0]*b[0]+a[1]*b[1]+a[2]*b[2])
def length(a):
return sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])
def cross(a, b):
return [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]]
def angle(a, b):
return atan2(length(cross(a, b)), dot(a, b))
list = [[u'pPlane1.vtx[0]', [-5.5992126244689686, -13.957681553171557, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.0, 0.0], 1], [u'pPlane1.vtx[1]', [3.0597372275207775, -13.957681553171557, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.5, 0.0], 1], [u'pPlane1.vtx[4]', [3.0597372275207775, -0.45139588575212297, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.5, 0.77990323305130005], 1], [u'pPlane1.vtx[3]', [-5.5992126244689686, -0.45139588575212297, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.0, 0.77990323305130005], 1], [u'pPlane1.vtx[1]', [3.0597372275207775, -13.957681553171557, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.5, 0.0], 1], [u'pPlane1.vtx[2]', [11.718687079510524, -13.957681553171557, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [1.0, 0.0], 1], [u'pPlane1.vtx[5]', [11.718687079510524, -0.45139588575212297, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [1.0, 0.77990323305130005], 1], [u'pPlane1.vtx[4]', [3.0597372275207775, -0.45139588575212297, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], [0.5, 0.77990323305130005], 1]]
UEvert = 0
tolerance3d = 0.008
tolerance2d = 1.0/1024
tolerancecolor = 1.0/256
tolerancenormal = 0.00008
lenUVSets = 1
vertexD = []
while len(list)>0:
d = []
for i, t in enumerate(list[1:]):
if (distance3d(list[0][1],t[1])<tolerance3d) \
& (angle(list[0][2], t[2])<tolerancenormal) \
& all(distance2d(list[0][4+n],t[4+n])<tolerance2d for n in range(lenUVSets)) \
& all(list[0][4+lenUVSets+n]==t[4+lenUVSets+n] for n in range(lenUVSets)) \
& all(abs(list[0][3][n]-t[3][n])<tolerancecolor for n in range(3)) \
: d.append(i)
vertexD.append(list[0][0])
del list[0]
n = 0
for i in d: del list[i-n]; n += 1
UEvert += 1
print UEvert