我正在努力解决python中的数学组合问题,其中我们选择了一个由5人组成的委员会,其中女性占多数,来自8名男性和9名女性。 我的代码:
import random
people=["m1", "m2", "m3","m4", "m5", "m6" , "m7","m8", "l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9"]
combinations=[]
for g in range(10000):
a=random.sample(people, k=5)
b=a.count("l1")
b+=a.count("l2")
b+=a.count("l3")
b+=a.count("l4")
b+=a.count("l5")
b+=a.count("l6")
b+=a.count("l7")
b+=a.count("l8")
b+=a.count("l9")
if b>=3:
if a in combinations:
pass
else:
combinations.append(a)
print (len(combinations))
但出于某种原因,这包括重复的群体。这意味着我的最后几行代码无法正常工作。
答案 0 :(得分:1)
主要问题是in
考虑了顺序。在您的列表列表中,
['l1', 'l2', 'l6', 'm6', 'm8'] != ['l2', 'l1', 'l6', 'm6', 'm8']
所以诀窍是将sort
应用于随机选择,因此您不会在不同的顺序中获得相同的组(阅读:How to efficiently compare two unordered lists (not sets) in Python?)。
此外,在列表中使用in
是性能问题。最好使用set
进行快速查找,但在这种情况下,请将list
转换为tuple
(如list
,但不可变,因此 hashable )能够将其放入set
。
最后一招:你的计数很笨拙。通过l
计算开始的元素,检查第一个字母是否为l
,在生成器理解中提供给内置的sum
函数。
import random
people=["m1", "m2", "m3","m4", "m5", "m6" , "m7","m8", "l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9"]
combinations=set()
for g in range(10000):
a = tuple(sorted(random.sample(people, k=5)))
b = sum(x[0]=="l" for x in a)
if b>=3:
combinations.add(a)
print (len(combinations))