寻找一种方法来删除重复的答案

时间:2017-12-17 20:57:13

标签: python python-3.x

我想编写一个代码,用于检测表面上100个随机圆的碰撞,范围为-15 <= x,y <= 15。代码运行良好,但有一个问题恰好是重复的反向答案,例如程序给我的结果如:

disc 1 with disc 85
disc 8 with disc 35
...................
disc 35 with disc 8
...................
disc 85 with disc 1
...................

因此它只会显示1和85而不会反转85和1。 我正在试图找出如何删除它们,因为我需要它来代码的下一部分。

import math    
lista=[[],[],[]]  
import random

for i in range(0,100):  
    lista[0].append(random.uniform(-14.5,14.5))  
    lista[1].append(random.uniform(-14.5,14.5))  
    lista[2].append(0.5)

def kol(a):  
    for i in range(0,100):  
        q1=lista[0][i]  
        w1=lista[1][i]  
        for k in range(0,100):  
            if k==i:  
                continue  
            q2=lista[0][k]  
            w2=lista[1][k]  
            if math.sqrt((abs(q1-q2))**2+(abs(w1-w2))**2)<1:                     
                  print('Kolizja dysków: ',i+1,'z',k+1)

print(kol(1))

2 个答案:

答案 0 :(得分:1)

你的循环检查距离两次,因为你只排除了相同的索引,而不是上三角或下三角,这解释了重复。

我按原样改写:

for i in range(0,100):  
    q1=lista[0][i]  
    w1=lista[1][i]  
    for k in range(i+1,100): # only above i  
        q2=lista[0][k]  
        w2=lista[1][k]  
        if ((abs(q1-q2))**2+(abs(w1-w2))**2)<1:                     
              print('Kolizja dysków: ',i+1,'z',k+1)

除此之外,不要测试平方根,因为平方值&lt; 1相当于值&lt; 1,所以节省一些计算能力。

答案 1 :(得分:1)

而不是

for k in range(0,100):

使用

for k in range(i + 1, 100):

因此k始终大于i