如何解决在列表中查找`n` 个不同的元素,有重复项,== 可以,=== 不是
我正在尝试实现差分进化优化算法,我需要一种方法来从列表中提取不同的实体。它们可以是相同的值,但不能是相同的实体。
solutions = [[random.uniform(0,1) for _ in range(30)] \
for _ in range(100)]
for base_agent in solutions:
agents = []
while len(agents) < 3:
p = solutions[random.randint(0,len(solutions))]
if p in agents or p is base_agent:
continue
else:
agents.add(p)
if base_agent in agents \
or agents[0] is agents[1] \
or agents[1] is agents[2] \
or agents[2] is agents[0]:
print("Bad execution")
exit(1)
print("Correct execution")
这是我所追求的(非工作)总体思路。
我希望 base_agent
不在 agents
中,并且我希望 agents
不包含重复条目。条目可以是相同的值(例如它们可以 ==
),但它们不能是相同的实体(例如它们不能 ===
)。 agents
在此 while 循环结束时应包含 3 个元素。
random.sample
可以从列表中给我一个随机样本,但它仍然可能包含 base_agent
。
有什么想法吗?
解决方法
最简单的代码是只使用 random.sample
,排除您试图避免的单个元素。当然,它涉及切出所有元素,除了 base_element
,但是当 O(n²)
只有 30 时,n
的工作并不是什么大问题:
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.combinations
做一些俗气的 hack,让它为你生成与当前 base_agent
不匹配的所有值:>
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)
组合“除一个元素之外的所有元素”,以相反的顺序使用 solutions
意味着 combinations
的每个输出都是除 solutions
上每次迭代中获得的元素之外的所有元素,所以不需要切片。
is
是“不同元素”的python 运算符。不过,与 JavaScript 的 ===
不完全一样,is
所做的是比较内存地址。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。