如何从python列表中删除随机生成的重复值

How to remove duplicate values generated randomly from list in python

提问人:Manisha Biswas 提问时间:10/23/2019 更新时间:10/23/2019 访问量:407

问:

我有一个输入点列表:

input_points = [{'name': 'a', 'value': (0.0, 1.0)}, {'name': 'b', 'value': (2.0, 1.0)},
                {'name': 'c', 'value': (3.0, 1.0)}, {'name': 'd', 'value': (0.0, 3.0)},
                {'name': 'e', 'value': (1.0, 2.0)}, {'name': 'f', 'value': (1.5, 1.5)},
                {'name': 'g', 'value': (1.0, 1.0)}, {'name': 'h', 'value': (1.5, 2.0)}]

我必须迭代生成两个随机点。我使用 random.sample() 作为:

for x in range(100):
    point1 = random.sample(input_points, 2)
    print(point1)

但它给了我一个重复点的组合,这就是为什么我没有一直得到 100 次迭代列表中所有点的组合。但是我只需要在 100 次迭代中遍历所有点。有什么方法可以删除重复项,从而在 100 次迭代中获得所有点的组合。

谢谢

python 列表 随机

评论

0赞 Selcuk 10/23/2019
对于 8 个点的列表,没有 100 个独特的 2 点组合。此外,使用并不是找到所有可能组合的最佳方法。这是学校评估吗?有什么限制?random
0赞 Manisha Biswas 10/23/2019
将有 28 个 8 点的独特组合,我有一个限制,即在 100 次迭代中从 8 个点中选择所有 2 个点的唯一组合。
0赞 Selcuk 10/23/2019
不过,你必须使用吗?这可以很容易地使用两个嵌套循环在恰好 28 次迭代中完成。randomfor
0赞 Manisha Biswas 10/23/2019
还有一个计算时间限制,实际上我必须通过实现 ransac 算法来计算这些点的最佳线拟合。我不限于使用随机。你能告诉我如何使用嵌套循环实现这一点吗
0赞 Selcuk 10/23/2019
好吧,ransac 算法依赖于随机样本,所以我不确定迭代方法是否能帮助您实现这一目标,但我会发布一个示例。

答:

0赞 Selcuk 10/23/2019 #1

您可以使用嵌套循环以迭代方式找到所有迭代:

pairs = []
for i, point1 in enumerate(input_points):
    for point2 in input_points[i+1:]:
        pairs.append([point1, point2])

然而,Ransac 算法取决于随机样本以及它们与模型的拟合程度。

0赞 DarrylG 10/23/2019 #2

我们可以:

1)创建所有点组合对。

2)对这些对进行随机抽样。

import random
from itertools import combinations

input_points = [{'name': 'a', 'value': (0.0, 1.0)}, {'name': 'b', 'value': (2.0, 1.0)},
                {'name': 'c', 'value': (3.0, 1.0)}, {'name': 'd', 'value': (0.0, 3.0)},
                {'name': 'e', 'value': (1.0, 2.0)}, {'name': 'f', 'value': (1.5, 1.5)},
                {'name': 'g', 'value': (1.0, 1.0)}, {'name': 'h', 'value': (1.5, 2.0)}]

all_pairs = list(combinations(input_points, 2))

y = random.sample(all_pairs, 10) # random sample of pairs 
                                 # (in this case 10 pairs)
                                 # max we could get is 28