将列表列表与自身进行比较

web*_*ker 2 python algorithm list data-structures

我已经解决了这个问题,我只想找到一种更有效的方法.我有一个很大的列表列表,我试图将大列表中的每个列表相互比较.

如何避免重复比较,比较已经比较过的列表?

例如:big_list [0]已经与big_list [20]进行了比较,因此没有理由在循环中将big_list [20]与big_list [0]进行比较.

        big_list= [[0.12, 0.939, -0.321, 6.342], [0.12, 0.939, -0.321,6.342], [0.0, 1.0, -0.0, -5.166], [0.0, 1.0, 0.0, -5.166], [0.0, 1.0, -0.0, -5.166], [-0.0, 1.0, 0.0, -5.166], [0.0, 1.0, 0.0, -5.166], [0.0, 1.0, 0.0, -5.166], [0.0,1.0, -0.0, -5.166], [0.0, 1.0, 0.0, -5.166], [-0.0, 1.0, -0.0, -5.166], [-0.0, 1.0, 0.0, -5.166], [-0.12, 0.939, 0.321, 0.282], [-0.12, 0.939, 0.321, 0.282], [0.12, 0.939, 0.321, -17.782], [0.12, 0.939, 0.321, -17.782], [-0.0, 1.0, 0.0, 0.834], [0.0, 1.0, 0.0, 0.834], [0.0, 1.0, 0.0, 0.834], [0.0, 1.0, 0.0, 0.834], [-0.12, 0.939, -0.321, 24.406], [-0.12, 0.939, -0.321, 24.406], [0.0, 0.874, -0.486, 21.883], [0.0, 0.874, -0.486, 21.883], [0.0, 0.874, 0.486, -14.598], [0.0, 0.874, 0.486, -14.598]]

        for j in range(len(big_list)):
            for k in range(len(big_list)):
                if j!=k: 

                   result=math.sqrt(sum([(a-b)**2 for a,b in zip(big_list[j],big_list[k])])))
Run Code Online (Sandbox Code Playgroud)

以前,我通过设置一个特定的容差并将每个结果附加到一个新的列表来解决这个问题,但我试图想出一个更有效的方法来做到这一点.最终,big_list可能会有100万个+列表

if result<=rel_tol and big_list[k] not in new_list:
    new_list.append(big_list[k])
Run Code Online (Sandbox Code Playgroud)

Jus*_*nan 6

而不是做:

for j in range(len(big_list)):
        for k in range(len(big_list)):
Run Code Online (Sandbox Code Playgroud)

这样做(注意j+1):

for j in range(len(big_list)):
        for k in range(j+1, len(big_list)):
Run Code Online (Sandbox Code Playgroud)

这样你的内部循环就跳过了你已经看过的所有索引,避免了重复的比较.