列表在python3中排序

时间:2018-05-27 19:24:17

标签: python python-3.x if-statement

我正在努力解决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))

但出于某种原因,这包括重复的群体。这意味着我的最后几行代码无法正常工作。

1 个答案:

答案 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))