Python 在列表中查找具有重复项的`n`不同元素,==可以,==不可以

Python 在列表中查找具有重复项的`n`不同元素,==可以,==不可以,python,list,sample,distinct-values,Python,List,Sample,Distinct Values,我正在尝试实现一个差分进化优化算法,我需要一种从不同实体列表中获取数据的方法。它们可以是相同的值,但不能是相同的实体 solutions=[[random.uniform(0,1)表示范围(30)]\ 对于uuu在范围内(100)] 对于解决方案中的基本代理: 代理=[] 而len(代理人)

我正在尝试实现一个差分进化优化算法,我需要一种从不同实体列表中获取数据的方法。它们可以是相同的值,但不能是相同的实体

solutions=[[random.uniform(0,1)表示范围(30)]\
对于uuu在范围内(100)]
对于解决方案中的基本代理:
代理=[]
而len(代理人)<3:
p=解[random.randint(0,len(解))]
如果p在代理中或p是基本代理:
持续
其他:
代理。添加(p)
如果代理中有基本代理\
或代理[0]是代理[1]\
或代理人[1]是代理人[2]\
或代理[2]是代理[0]:
打印(“错误执行”)
出口(1)
打印(“正确执行”)
这是我所追求的(非工作)总体想法

我希望
base\u agent
不在
agents
中,并且我希望
agents
不包含重复条目。条目可以是相同的值(例如,它们可以
==
),但不能是相同的实体(例如,它们不能
==
)<代码>代理在该while循环结束时应包含3个元素

random.sample
可以从列表中给我一个随机样本,但它仍然可能包含
base\u agent


有什么想法吗?

是“不同元素”的python操作符。尽管与JavaScripts不同,
所做的是比较内存地址。

最简单的代码就是使用
随机。示例
,不包括您试图避免的单个元素。当然,它需要切掉所有的元素,只保留
base\u元素
,但是
O(n²)
n
只有30时,工作并不是一个大问题:

import random

for i, base_agent in enumerate(solutions):
    agents = random.sample(solutions[:i] + solutions[i+1:], 3)
    # Do stuff with base_agent which is distinct from all elements of agents
如果你真的不喜欢切片或使用索引值,你可以使用
itertools.compositions
进行简单的破解,让它为你生成所有与当前
base\u代理不匹配的值:

import random
from itertools import combinations

for base_agent, other_agents in zip(solutions, combinations(reversed(solutions), len(solutions) - 1)):
    agents = random.sample(other_agents, 3)

以相反顺序使用
解决方案组合“除一个元素外的所有元素”意味着
组合的每个输出都是所有元素,但在
解决方案的每次迭代中得到的元素除外,因此不需要切片。

基本代理
在某种程度上是
解决方案
中的每个元素。你是说你想要一个
base\u代理
,并且通过外环在每个循环上有三个不同的代理?请提供预期的(MRE)。我们应该能够复制和粘贴一个连续的代码块,执行该文件,并再现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和期望的输出来测试我们的建议。您发布的代码没有运行,并且您没有显示错误案例。您似乎希望从给定的总体中获得3个唯一的元素。使用
set
或任何其他方法来消除重复列表,删除
base\u agent
,并从中提取一个包含3个元素的
示例。@Prune:我不确定
set
是否有效,因为他们似乎认为可能存在相同身份的代理,他们应该在某种程度上得到不同的对待。这就是说,他们在代码中为
代理使用
集合
,因此,与所有其他代理相比,身份问题是否只适用于
基本代理
,还不清楚,而其他代理可以相互重复,以消除与
基本代理配对的三个代理。如果
base\u agent是1
,那么
agent
可能包括
True
(这与
1
不同),但也不包括
1.0
True==1.0
)。@Prune:澄清一下,不要说你错了。如果所有可能的代理集如果
[1,1,1,2,3,4]
(其中所有数字都假定为不同的身份,即使CPython将其设置为单态),则他们需要明确结果中出现
1
的几率是否应显著高于任何其他数字的几率,以及是否可以在结果中包含一个以上的
1
(如果两个问题的答案都是“否”,则预转换为
set
有效,但如果两个问题的答案都是“是”,则不起作用);他们似乎用它来表示与Python的
is
相同的意思,这是一种身份测试,而不是JS的古怪类型严格相等测试。