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的古怪类型严格相等测试。